この章では、Oracle CQL文の最も単純な構成要素のリファレンス情報を提供します。
Oracle CQLには、次の基本要素があります。
第IV部「Oracle CQLの使用」に説明されている文を使用する前に、この章で説明する概念を理解しておく必要があります。
Oracle CEPで操作されるそれぞれの値にはデータ型があります。値のデータ型によって、固定のプロパティ・セットが値に関連付けられます。Oracle CEPではこれらのプロパティによって、あるデータ型の値が別のデータ型の値とは異なる方法で処理されます。たとえば、INTEGER
データ型の値は加算できますが、CHAR
データ型の値は加算できません。ストリームを作成する場合は、各要素のデータ型を指定する必要があります。ユーザー定義関数を作成する場合は、各引数のデータ型を指定する必要があります。これらのデータ型は、各要素または各引数が保持できる値の範囲を定義します。たとえば、データ型がTIMESTAMP
の属性は、February 29(うるう年を除く)や、2または'SHOE'などの値を受け入れることができません。Oracle CQLでは多数の組込みデータ型を使用できます。Oracle CQLデータ型の構文について、次の図に示します。
Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、Oracle CQLデータ・カートリッジまたはユーザー定義関数を作成してOracle CQL問合せでそのデータ型を評価できます。
詳細は、以下を参照してください。
表2-1は、Oracle CQL組込みデータ型の概要を示しています。構文の要素については、前の項の構文を参照してください。
イベント・タイプを定義する場合は、これらのデータ型およびデータ型リテラルの制限を検討します。詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CEPのイベント・タイプの作成に関する項を参照してください。
表2-1 Oracle CQL組込みデータ型の概要
Oracle CQLデータ型 | 説明 |
---|---|
Java 詳細は、2.4.2項「数値リテラル」を参照してください。 |
|
Java |
|
|
長さが 詳細は、2.4.2項「数値リテラル」を参照してください。 |
|
長さが 詳細は、2.4.1項「テキスト・リテラル」を参照してください。 |
Java 詳細は、2.4.2項「数値リテラル」を参照してください。 |
|
Java 詳細は、2.4.2項「数値リテラル」を参照してください。 |
|
Java 詳細は、2.4.2項「数値リテラル」を参照してください。 |
|
固定長の 詳細は、2.4.4項「期間リテラル」を参照してください。 |
|
固定長の 詳細は、2.4.3項「日時リテラル」を参照してください。 |
|
このデータ型は、XMLデータを含むストリーム要素に使用します。最大長は4096文字です。
詳細は、「SQL/XML (SQLX)」を参照してください。 |
|
任意のJavaオブジェクト(つまり、 Oracle CEPエンジンでは 通常、この型はアダプタから送り先に値をそのまま渡す場合に使用します。Oracle CEPエンジンではこれらの値を解釈する必要はありませんが( |
脚注1Oracle CQLでは1次元配列のみがサポートされます。
Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、Oracle CQLデータ・カートリッジを作成してOracle CQL問合せでそのデータ型を評価できます。
Oracle CQLには、次のデータ・カートリッジが含まれます。
詳細は、14章「データ・カートリッジの概要」を参照してください。
Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、ユーザー定義関数を作成してOracle CQL問合せでそのデータ型を評価できます。
例2-1のようなenum
データ型があるとします。例2-2に示すイベントでは、このenum
データ型を使用しています。Oracle CQLではenum
データ型がサポートされていません。
例2-2 列挙データ型ProcessStatusを使用するイベント
package com.oracle.app; import com.oracle.capp.ProcessStatus; public class ServiceOrder { private String serviceOrderId; private String electronicSerialNumber; private ProcessStatus status; ... }
ユーザー定義関数を作成し(例2-3を参照)、アプリケーション・アセンブリ・ファイルに関数を登録することで(例2-4を参照)、このenum
データ型をOracle CQL問合せで評価できます(例2-5を参照)。
例2-3 列挙データ型を評価するユーザー定義関数
package com.oracle.app; import com.oracle.capp.ProcessStatus; public class CheckIfStatusClosed { public boolean execute(Object[] args) { ProcessStatus arg0 = (ProcessStatus)args[0]; if (arg0 == ProcessStatus.OPEN) return Boolean.FALSE; else return Boolean.TRUE; } }
例2-4 アプリケーション・アセンブリ・ファイルへのユーザー定義関数の登録
<wlevs:processor id="testProcessor"> <wlevs:listener ref="providerCache"/> <wlevs:listener ref="outputCache"/> <wlevs:cache-source ref="testCache"/> <wlevs:function function-name="statusClosed" exec-method=”execute” /> <bean class="com.oracle.app.CheckIfStatusClosed"/> </wlevs:function> </wlevs:processor>
例2-5 ユーザー定義関数を使用したOracle CQL問合せでの列挙データ型の評価
<query id="rule-04"><![CDATA[ SELECT meter.electronicSerialNumber, meter.exceptionKind FROM MeterLogEvent AS meter, ServiceOrder AS svco WHERE meter.electronicSerialNumber = svco.electronicSerialNumber and svco.serviceOrderId IS NULL OR statusClosed(svco.status) ]]></query>
詳細は、第13章「ユーザー定義関数」を参照してください。
この項では、Oracle CEPでの各データ型の値の比較方法について説明します。
遅い日付は早い日付よりも大きいと見なされます。たとえば、'29-MAR-2005'
と同等の日付は'05-JAN-2006'
よりも小さい日付です。'05-JAN-2006 1:35pm'
は'05-JAN-2005 10:09am'
よりも大きい日付です。
Oracle CQLでは辞書順に基づいた辞書的ソートがサポートされています。
内部的には、Oracle CQLではchar
の数値が比較されます。使用するエンコーディングに応じて数値は異なりますが、通常は、比較する際に違いはありません。例:
'a' < 'b' 'aa' < 'ab' 'aaaa' < 'aaaab'
通常、式では異なるデータ型の値を使用できません。たとえば、算術式で5 × 10の乗算の後に'JAMES'
を加算することはできません。ただし、Oracle CEPではあるデータ型から別のデータ型への暗黙的および明示的な値の変換がサポートされています。
暗黙的または自動的な変換に依存するかわりに、Oracleでは明示的な変換の指定をお薦めします。これは、次の理由によります。
明示的なデータ型変換関数を使用すると、Oracle CQL文が読みやすくなります。
暗黙的なデータ型変換はパフォーマンスに悪影響を及ぼす可能性があります。
暗黙的な変換は発生したコンテキストに依存し、すべてのケースで同じように動作しない可能性があります。
暗黙的な変換のアルゴリズムはソフトウェア・リリース間やOracle製品間で変更される場合があります。明示的な変更では、動作がより安定しています。
この項の内容は、次のとおりです。
Oracle CEPでは、変換に意味がある場合に、あるデータ型から別のデータ型に値が自動的に変換されます。
表2-2は、Oracleの暗黙的な変換を示しています。この表は、使用可能なすべての変換を示しています(X
マークが付けられています)。サポートされていない変換には--
マークが付けられています。
表2-2 暗黙的な型変換のマトリックス
CHAR | BYTE | BOOLEAN | INTEGER | DOUBLE | BIGINT | FLOAT | TIMESTAMP | INTERVAL | |
---|---|---|---|---|---|---|---|---|---|
CHARから |
|
|
|
|
|
|
|
|
|
BYTEから |
|
|
|
|
|
|
|
|
|
BOOLEANから |
|
|
|
|
|
|
|
|
|
INTEGERから |
|
|
|
|
|
|
|
|
|
DOUBLEから |
|
|
|
|
|
|
|
|
|
BIGINTから |
|
|
|
|
|
|
|
|
|
FLOATから |
|
|
|
|
|
|
|
|
|
TIMESTAMPから |
|
|
|
|
|
|
|
|
|
INTERVALから |
|
|
|
|
|
|
|
|
|
次の規則は、Oracle CEPで暗黙のデータ型変換が行われる方向を決定します。
SELECT
FROM
操作で、Select句に算術式または条件の評価が含まれている場合、Oracle CEPではストリームのデータがターゲット変数の型に変換されます。
たとえば、c1+2.0
などの式評価やc1 < 2.0
などの条件評価のコンテキストでc1
がINTEGER
型である場合に、暗黙的な変換が発生します。
FLOAT
からBIGINT
への変換は正確です。
BIGINT
値が使用する精度のビット数がFLOAT
でサポートされる数を超えている場合、BIGINT
からFLOAT
への変換は正確ではありません。
文字値とTIMESTAMP
値を比較する場合、Oracle CEPでは文字データがTIMESTAMP
に変換されます。
Oracle CQL関数または演算子で許可されていないデータ型の引数を使用すると、Oracle CEPではサポートされている場合は必ず、引数が使用可能なデータ型に変換されます。
代入時、Oracle CEPでは等号(=
)の右側の値が、左側の代入対象のデータ型に変換されます。
連結操作時、Oracle CEPでは文字以外のデータ型がCHAR
に変換されます。
文字データ型と文字以外のデータ型の間で算術演算または比較を行う場合、Oracle CEPでは数値型がCHAR
に変換されます(表2-2を参照)。
Oracle CQL変換関数を使用して、明示的にデータ型の変換を指定できます。表2-3は、あるデータ型から別のデータ型に値を明示的に変換するOracle CQL関数を示しています。サポートされていない変換には--
マークが付けられています。
表2-3 明示的な型変換のマトリックス
CHAR | BYTE | BOOLEAN | INTEGER | DOUBLE | BIGINT | FLOAT | TIMESTAMP | INTERVAL | |
---|---|---|---|---|---|---|---|---|---|
CHARから |
-- |
|
-- |
-- |
-- |
-- |
-- |
|
-- |
BYTEから |
-- |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
BOOLEANから |
|||||||||
INTEGERから |
|
-- |
|
-- |
|
|
|
-- |
-- |
DOUBLEから |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
LONGから |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
|
-- |
BIGINTから |
|
-- |
|
-- |
|
-- |
|
-- |
-- |
FLOATから |
|
-- |
-- |
-- |
|
-- |
-- |
-- |
-- |
TIMESTAMPから |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
INTERVALから |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。その場合は、Oracle CEPでサポートされる同等のSQLおよびOracle CEPデータ型に注意を払う必要があります。
詳細は、以下を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイドの同等のSQL列の型およびOracle CEPの型に関する項
実行時、Oracle CEPではデータ・カートリッジの実装に応じて、Oracle CQLとデータ・カートリッジのデータ型との間でマッピングが行われます。
詳細は、以下を参照してください。
Oracle Javaデータ・カートリッジ: 15.1.4項「データ型マッピング」
Oracle Spatial: 16.1.3項「データ型マッピング」
実行時、Oracle CEPではユーザー定義関数の戻り値の型に指定したOracle CQLデータ型とJavaの同等のデータ型との間でマッピングが行われます。
詳細は、13.1.2項「ユーザー定義関数のデータ型」を参照してください。
リテラルおよび定数値という用語は同義であり、固定のデータ値を指しています。たとえば、'JACK'
、'BLUE ISLAND'
、'101'
などはすべてテキスト・リテラルです。5001は数値リテラルです。
Oracle CEPでは、Oracle CQL文の次の種類のリテラルがサポートされています。
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文の構文でconst_string
、quoted_string_double_quotes
またはquoted_string_single_quotes
と示されている箇所では常にテキスト・リテラルの表記で値を指定します。このリファレンスでは、テキスト・リテラル、文字リテラルおよび文字列という用語を区別なく使用しています。
テキスト・リテラルは、Oracle CEPでスキーマ・オブジェクト名と区別されるように、一重引用符または二重引用符で囲みます。
一重引用符('
)または二重引用符("
)を使用できます。通常は、二重引用符を使用します。ただし、特定の式、条件、関数および文では、このリファレンスの他の部分で指定されている構文に従って、quoted_string_double_quotes
またはquoted_string_single_quotes
のいずれかの引用符を使用する必要があります。
構文で単にconst_string
と示されている場合は、一重引用符または二重引用符のどちらでも使用できます。
構文でchar
という用語が示されている場合は、テキスト・リテラルを指定するか、または文字データに解決される別の式を指定できます。構文でchar
と示されている場所では、一重引用符は使用しません。
Oracle CEPではJavaローカリゼーションがサポートされています。Javaロケールで指定された文字セットのテキスト・リテラルを指定できます。
詳細は、以下を参照してください。
固定長の数値または浮動小数点数値を指定する場合は、数値リテラルの表記を使用します。
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数、およびOracle CQL文でinteger
と示されている箇所では常に整数表記を使用して整数を指定する必要があります。
integer
の構文は次のとおりです。
digit
は0、1、2、3、4、5、6、7、8、9のいずれかです。
次に、有効な整数を示します。
7 +255
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracleCQL文でnumber
またはn
と示されている箇所では、常に数または浮動小数点数の表記を使用して値を指定する必要があります。
number
の構文は次のとおりです。
説明:
+は正、-は負の値を示します。符号を省略すると、デフォルトで正の値になります。
digit
は0、1、2、3、4、5、6、7、8、9のいずれかです。
f
またはF
は数値がFLOAT
型の64ビット・バイナリ浮動小数点数であることを示します。
d
またはD
は数値がDOUBLE
型の64ビット・バイナリ浮動小数点数であることを示します。
f
またはF
およびd
またはD
を省略すると、数値は型INTEGER
になります。
接尾辞f
またはF
およびd
またはD
は浮動小数点数リテラルでのみサポートされ、INTEGER
に変換される文字列ではサポートされていません。たとえば、Oracle CEPでINTEGER
が予期されている場合に文字列'9'
が検出されると、文字列はJava Integer
9に変換されます。ただし、Oracle CEPで文字列'9f'
が検出された場合は、変換が失敗しエラーが返されます。
INTEGER
型の数は最大32桁の精度を格納できます。BIGINT
またはFLOAT
で提供される精度よりも高い精度をリテラルが必要とする場合、Oracle CEPでは値が切り詰められます。リテラルの範囲がBIGINT
またはFLOAT
でサポートされる範囲を超えた場合、Oracle CEPではエラーが発生します。
Javaロケールでピリオド(.
)以外の小数点を使用している場合は、'text'
表記を使用して数値リテラルを指定する必要があります。この場合、Oracle CEPではテキスト・リテラルが自動的に数値に変換されます。
注意: この表記は、浮動小数点数リテラルでは使用できません。 |
たとえば、Javaロケールでカンマ(,)の小数点が指定されている場合は、次のように数値5.123を指定します。
'5,123'
次に、有効なNUMBER
リテラルを示します。
25 +6.34 0.5 -1
次に、有効な浮動小数点数リテラルを示します。
25f +6.34F 0.5d -1D
Oracle CEPでは、日時データ型TIMESTAMP
がサポートされています。
日時リテラルは64バイトを超えることはできません。
すべての日時リテラルは、Oracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルのいずれかに準拠している必要があります。詳細は、2.5.2項「日時書式モデル」を参照してください。
現在、SimpleDateFormat
クラスではxsd:dateTime
がサポートされていません。このため、Oracle CQLではこの型を使用するXML要素または属性がサポートされていません。
たとえば、XMLイベントが例2-6のようなXSDを使用する場合、Oracle CQLではMyTimestamp
要素を解析できません。
例2-6 無効なイベントXSD: xsd:dateTimeがサポートされていない
<xsd:element name="ComplexTypeBody">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyTimestamp" type="xsd:dateTime"/>
<xsd:element name="ElementKind" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="node" type="SimpleType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
XSDを定義してxsd:dateTime
をxsd:string
で置き換えることをお薦めします(例2-7を参照)。
例2-7 有効なイベントXSD: xsd:dateTimeのかわりにxsd:stringを使用する
<xsd:element name="ComplexTypeBody">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyTimestamp" type="xsd:string"/>
<xsd:element name="ElementKind" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="node" type="SimpleType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
例2-7のXSDを使用すると、Oracle CQLでは、Timestamp
要素のString
値がOracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルに準拠しているかぎり、例2-8に示すようなイベントを処理できます。詳細は、2.5.2項「日時書式モデル」を参照してください。
例2-8 XMLイベント・ペイロード
<ComplexTypeBody xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...> <MyTimestamp>2000-01-15T00:00:00</MyTimestamp> <ElementKind>plus</ElementKind> <name>complexEvent</name> <node> <type>complexNode</type> <number>1</number> </node> </ComplexTypeBody>
Oracle CQLでのXMLの使用の詳細は、「SQL/XML (SQLX)」を参照してください。
期間リテラルは期間を指定します。Oracle CEPでは期間リテラルDAY
TO
SECOND
がサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲(SECOND
やMINUTE to SECOND
など)はサポートされていません。
期間リテラルは64バイトを超えることはできません。
次の構文を使用して、DAY
TO
SECOND
期間リテラルを指定します。
const_string
は、適切な日時書式モデルに準拠するTIMESTAMP
値です(2.5.2項「日時書式モデル」を参照)。
INTERVAL
DAY
TO
SECOND
リテラルの書式の例を示します。
期間リテラルの形式 | 解釈 |
---|---|
INTERVAL '4 5:12:10.222' DAY TO SECOND(3) |
4日、5時間、12分、10秒、222ミリ秒。 |
あるDAY
TO
SECOND
期間リテラルを別のDAY
TO
SECOND
リテラルと加算または減算したり、期間リテラルを比較したりできます(例2-9を参照)。この例で、ストリームtkdata2_SIn1
のスキーマは(c1 integer, c2 interval)
です。
書式モデルは、文字列に格納されている日時または数値データの形式を記述する文字リテラルです。文字列を日付または数値に変換する場合、Oracle CEPでの文字列の解釈のしかたは書式モデルによって決まります。Oracle CQL問合せに関連する次の書式モデルがあります。
Oracle CQLではjava.text.SimpleDateFormat
が指定する書式モデルがサポートされています。
表2-4は、Oracle CQLがTIMESTAMP
リテラルの解釈に使用するjava.text.SimpleDateFormat
モデルを示しています。詳細は、2.4.3項「日時リテラル」を参照してください。
表2-4 日時書式モデル
書式モデル | 例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
次の関数で、日時書式モデルを使用できます。
to_timestamp
: char
データ型の値をTIMESTAMP
データ型に変換します。
列の行に値がない場合、その列はnullである、またはnullを含んでいると言います。主キー整合性制約によって制限されていない任意のデータ型のタプルでは、nullが含まれている場合があります。実際の値が不明な場合や、値が意味を持たない場合はnullを使用します。
Oracle CEPでは、長さが0の文字値はnullとして処理されます。ただし、数値0を表す場合にはnullを使用しないでください。これらは等しくありません。
注意: 現在、Oracle CEPでは長さ0の文字値がnullとして処理されます。ただし、将来のリリースではこの処理が変更される場合があるため、空の文字列をnullと同じように処理しないことをお薦めします。 |
nullを含む算術式は常にnullに評価されます。たとえば、10にnullを加算したものはnullです。実際、nullオペランドを指定すると、すべての演算子ではnullが返されます(連結を除く)。
詳細は、以下を参照してください。
null引数を指定すると、すべてのスカラ関数ではnullが返されます(nvl
とconcat
を除く)。nvl
関数を使用すると、nullが発生した場合に値を返すことができます。たとえば、式NVL(commission_pct,0)
は、commission_pct
がnullの場合に0を返し、nullでない場合にcommission_pct
の値を返します。
ほとんどの集計関数ではnullが無視されます。たとえば、1000
、null
、null
、null
および2000
の5つの値を平均する問合せがあるとします。このような問合せではnullが無視され、平均は(1000+2000)/2 = 1500
のように計算されます。
nullをテストするには、null比較条件のみを使用します(null_conditions::=を参照)。それ以外の条件をnullで使用すると、結果がnull値に依存し、結果がUNKNOWN
になります。nullはデータがないことを表すため、任意の値または別のnullと等しいか等しくないかを比較できません。ただし、Oracle CEPではdecode式の評価時に2つのnullが等価であると見なされます。構文と追加情報については、decode::=を参照してください。
UNKNOWN
に評価される条件はFALSE
とほぼ同様に動作します。たとえば、条件のWHERE
句がUNKNOWN
に評価されるSELECT
文ではタプルが返されません。ただし、UNKNOWN
に評価される条件は、UNKNOWN
条件の評価でさらに操作を行う場合はUNKNOWN
に評価されるのでFALSE
とは異なります。このため、NOT
FALSE
はTRUE
に評価されますが、NOT
UNKNOWN
はUNKNOWN
に評価されます。
表2-5は、条件でnullを使用する場合の様々な評価の例を示しています。SELECT
文のWHERE
句でUNKNOWN
に評価される条件を使用する場合、問合せで返される行はありません。
条件 | Aの値 | 評価 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
詳細は、6.6項「Null条件」を参照してください。
Oracle CQLでは、問合せを簡易化して分かりやすくするために、別名(またはシノニム)を定義できます。
この項の内容は、次のとおりです。
AS
演算子を使用すると、Oracle CQLで問合せ、リレーション、ストリームおよび問合せのSELECT
リスト項目の別名を指定できます。
この項の内容は、次のとおりです。
詳細は、第18章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
relation_variable
句のAS
演算子で別名を定義してselectリストの直前の式にラベルを付け、その名前で結果を参照できます。別名によって、問合せの期間中にselectリストの項目名が効率的に変更されます。別名は、ORDER
BY
句(18.2.9項「問合せ結果のソート」を参照)で使用できますが、問合せの他の句では使用できません。
例2-10は、SELECT
リストのストリーム要素its.itemId
の別名badItem
と、MATCH_RECOGNIZE
句の別名its
を定義する方法を示しています。
例2-10 SELECT文でのAS演算子の使用
<query id="detectPerish"><![CDATA[ select its.itemId as badItem from tkrfid_ItemTempStream MATCH_RECOGNIZE ( PARTITION BY itemId MEASURES A.itemId as itemId PATTERN (A B* C) DEFINE A AS (A.temp >= 25), B AS ((B.temp >= 25) and (to_timestamp(B.element_time) - to_timestamp(A.element_time) < INTERVAL "0 00:00:05.00" DAY TO SECOND)), C AS (to_timestamp(C.element_time) - to_timestamp(A.element_time) >= INTERVAL "0 00:00:05.00" DAY TO SECOND) ) as its ]]></query>
詳細は、18.2.1.3項「From句」を参照してください。
AS
演算子で別名を定義して直前のウィンドウ演算子にラベルを付け、その名前で結果を参照できます。
ウィンドウ演算子の内部ではAS
演算子を使用できませんが、ウィンドウ演算子の外部ではAS
演算子を使用できます。
例2-11は、分割範囲のウィンドウ演算子の後で別名bidとaskを定義する方法を示しています。
例2-11 ウィンドウ演算子の後のAS演算子の使用
<query id="Rule1"><![CDATA[ SELECT bid.id as correlationId bid.cusip as cusip max(bid.b0) as bid0 bid.srcid as bidSrcId, bid.bq0 as bid0Qty, min(ask.a0) as ask0, ask.srcid as askSrcId, ask.aq0 as ask0Qty FROM stream1[PARTITION by bid.cusip rows 100 range 4 hours] as bid, stream2[PARTITION by ask.cusip rows 100 range 4 hours] as ask GROUP BY bid.id, bid.cusip, bid.srcid,bid.bq0, ask.srcid, ask.aq0 ]]></query>
詳細は、1.1.3項「ストリームからリレーションへの演算子(ウィンドウ)」」を参照してください。
別名はロケーションの透過性を提供するために必要です。aliases
要素で別名を定義して、Oracle CQLの問合せやビューで使用できます。aliases
要素は、プロセッサのコンポーネント構成ファイルで構成します(図2-0を参照)。
例2-12 プロセッサのコンポーネント構成ファイルのaliases要素
<?xml version="1.0" encoding="UTF-8"?> <n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"> <processor> <name>processor1</name> <rules> <query id="q1"> <![CDATA[ select str(msg) from cqlInStream [rows 2]; ]]> </query> </rules> <aliases> <type-alias> <source>str</source> <target>java.lang.String </target> </type-alias> </aliases> </processor> </n1:config>
aliases
要素の有効範囲は、aliases
要素が属するプロセッサのrules
要素で定義された問合せとビューです。
次の点に注意してください。
別名がすでに存在する場合、Oracle CEPで例外がスローされます。
問合せまたはビュー定義が別名を参照している場合、別名はすでに存在する必要があります。
この項の内容は、次のとおりです。
aliases
要素の子要素type-alias
を使用して、データ型の別名を定義できます。任意の組込みまたはデータ・カートリッジ・データ型の別名を作成できます。
詳細は、2.2項「データ型」を参照してください。
aliases要素を使用してalias型を定義するには:
プロセッサのコンポーネント構成ファイルを編集します。
例2-13に示すようにaliases要素を追加します。
例2-13 プロセッサへのaliases要素の追加
<?xml version="1.0" encoding="UTF-8"?> <n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"> <processor> <name>processor1</name> <rules> <query id="q1"> <![CDATA[ select str(msg) from cqlInStream [rows 2]; ]]> </query> </rules> <aliases> </aliases> </processor> </n1:config>
例2-14に示すように、aliases要素にtype-alias
子要素を追加します。
例2-14 プロセッサへのalias型要素の追加
<?xml version="1.0" encoding="UTF-8"?> <n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"> <processor> <name>processor1</name> <rules> <query id="q1"> <![CDATA[ select str(msg) from cqlInStream [rows 2]; ]]> </query> </rules> <aliases> <type-alias> </type-alias> </aliases> </processor> </n1:config>
例2-15に示すように、type-alias
要素にsource
およびtarget
子要素を追加します。
source
は別名を指定します。
任意の有効なスキーマ名を使用できます。詳細は、2.9項「スキーマ・オブジェクト名と修飾子」を参照してください。
target
は、別名が参照するデータ型を指定します。
Oracle CQLデータ・カートリッジの型の場合は、完全修飾型名を使用します。詳細は、第14章「データ・カートリッジの概要」を参照してください。
例2-15 ソースおよびターゲット要素の追加
<?xml version="1.0" encoding="UTF-8"?> <n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"> <processor> <name>processor1</name> <rules> <query id="q1"> <![CDATA[ select str(msg) from cqlInStream [rows 2]; ]]> </query> </rules> <aliases> <type-alias> <source>str</source> <target>java.lang.String</target> </type-alias> </aliases> </processor> </n1:config>
問合せおよびビューで、このプロセッサに定義した別名を使用します。
別名は、参照するデータ型とまったく同じように使用できます。例2-16に示すように、別名を作成した型のメソッドおよびフィールドにアクセスできます。
例2-16 別名を作成した型のメソッドおよびフィールドへのアクセス
<?xml version="1.0" encoding="UTF-8"?>
<n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application">
<processor>
<name>processor1</name>
<rules>
<query id="q1">
<![CDATA[
select str(msg).length() from cqlInStream [rows 2];
]]>
</query>
</rules>
<aliases>
<type-alias>
<source>str</source>
<target>java.lang.String</target>
</type-alias>
</aliases>
</processor>
</n1:config>
一部のスキーマ・オブジェクトは、ストリームまたはビューのストリーム要素、整合性制約、ウィンドウ、ストリーム、ビューおよびユーザー定義の関数などの、ユーザーが指定できる部分または指定する必要のある部分で構成されています。この項の内容は、次のとおりです。
詳細は、1.2.1項「表記規則」を参照してください。
Oracle CEPの各オブジェクトには名前があります。Oracle CQL文では、引用符付きの識別子または引用符なしの識別子を使用してオブジェクト名を表します。
引用符付きの識別子は、先頭と末尾に二重引用符(")を付けます。引用符付きの識別子を使用してスキーマ・オブジェクトを命名した場合は、そのオブジェクトを参照するときに必ず二重引用符を使用する必要があります。
引用符なしの識別子は記号で囲みません。
Oracle CEPオブジェクトを命名する際は、引用符付きまたは引用符なしのどちらの識別子でも使用できます。
名前では大文字と小文字が区別されます。
特に記載のある場合を除いて、次の規則が引用符付きと引用符なしの両方の識別子に適用されます。
識別子がピリオドで区切られた複数の部分から成る場合、各属性は30バイトまでの長さで指定できます。各ピリオド区切り文字と外側の二重引用符は1バイトとしてカウントされます。たとえば、次のようなストリーム要素を識別するとします。
"stream"."attribute"
ストリーム名と要素名は30バイトの長さにできます。引用符記号とピリオドはそれぞれ1バイト文字であるため、この例の識別子の合計の長さは65バイトまで許可されます。
引用符なしの識別子は Oracle CEP予約語にできません。引用符付きの識別子は予約語にできますが、これは推奨されません。
Oracle CEPオブジェクトへのアクセスに使用するOracle製品によっては、製品固有の予約語により名前がさらに制限される可能性があります。
Oracle CQL言語には特殊な意味を持つ他の語が含まれています。これらの語は予約語ではありません。しかし、これらは内部的に特殊な方法で使用されます。このため、これらの語をオブジェクトやオブジェクトの各部分の名前として使用すると、Oracle CQL文が読みにくくなり、予期しない結果が生じることがあります。
詳細は、以下を参照してください。
異なるプラットフォームまたはオペレーティング・システム間で最適な互換性が提供されるため、スキーマ・オブジェクト名にASCII文字を使用することをお薦めします。
引用符なしの識別子は、データベース文字セットのアルファベット文字で開始する必要があります。引用符付きの識別子は任意の文字で開始できます。
引用符なしの識別子にはJavaロケールの文字セットの英数字、アンダースコア(_)、ドル記号($)、およびシャープ記号(#)のみを使用できます。引用符なしの識別子に$および#を使用しないことを強くお薦めします。
引用符付きの識別子には任意の文字、記号、およびスペースを使用できます。ただし、二重引用符またはnull文字(\0
)は、引用符付きまたは引用符なしのどちらの識別子にも使用できません。
詳細は、以下を参照してください。
通常、次のオブジェクトでは、アプリケーションで一意の名前を選択する必要があります。
ストリーム
問合せ
ビュー
ウィンドウ
ユーザー定義関数
特に、問合せとビューに同じ名前を付けることはできません。
引用符なしの識別子では大文字と小文字が区別されません。Oracle CEPではそれらが大文字として解釈されます。引用符付きの識別子では大文字と小文字が区別されます。
二重引用符で名前を囲むことによって、次の名前を同じネームスペースの異なるオブジェクトに割り当てることができます。
employees "employees" "Employees" "EMPLOYEES"
Oracle CEPでは次の名前が同等に解釈されるため、同じネームスペースの異なるオブジェクトにはこれらを使用できません。
employees EMPLOYEES "EMPLOYEES"
同一のストリームまたはビューのストリーム要素には同じ名前を使用できません。ただし、異なるストリームまたはビューのストリーム要素には同じ名前を使用できます。
関数の引数の個数およびデータ型が異なる(つまり、シグネチャが固有である)場合は、関数に同じ名前を使用できます。引数の異なる同名の関数を複数作成することは、関数のオーバーロードと呼ばれます。
組込み関数と同じ名前とシグネチャを持つユーザー定義関数を登録または作成すると、ユーザー関数が組込み関数のシグネチャに取ってかわります。組込み関数と同じ名前とシグネチャを持つ関数を作成することは、関数のオーバーライドと呼ばれます。
組込み関数はパブリックですが、ユーザー定義関数は特定のスキーマに属しています。
詳細は、以下を参照してください。
次に、オブジェクトおよび各部分の命名に役立つガイドラインを示します。
完全な、わかりやすい、発音可能な名前(またはよく知られた略語)を使用します。
一貫性のあるネーミング・ルールを使用します。
ストリーム、ビュー、および問合せ間で同一のエンティティまたは属性を記述するには、同じ名前を使用します。
オブジェクトを命名する際は、短くて簡単に使用できる名前と可能なかぎり説明的な名前を付けることのバランスを取ります。迷った場合は、より説明的な名前のほうを選びます。これは、Oracle CEPのオブジェクトが多くの人々によって一定の期間使用される可能性があるためです。payment_due_date
のかわりにpmdd
などのストリーム要素名を付けると、10年後のユーザーにとっては理解しづらいことが考えられます。
一貫性のあるネーミング・ルールを使用すると、アプリケーションでの各ストリームの役割が理解しやすくなります。このようなルールとして、FINANCE
アプリケーションに属するすべてのストリーム名をfin_
で開始するなどがあります。
ストリーム間で同一の項目を記述するには、同じ名前を使用します。たとえば、employees
およびdepartments
ストリームでは、どちらも部門番号のストリーム要素にdepartment_id
という名前を付けます。
次に、有効なスキーマ・オブジェクト名の例を示します。
last_name horse hr.hire_date "EVEN THIS & THAT!" a_very_long_and_valid_name
これらの例はすべて2.9.1項「スキーマ・オブジェクトのネーミング・ルール」のルールに従っています。次の例は30文字を超えているため無効です。
a_very_very_long_and_invalid_name