この章では、Oracle Continuous Query Language (Oracle CQL)の基本部分(データ型、リテラル、nullなど)のリファレンスを提供します。Oracle CQLは、Oracle Event Processingアプリケーションで使用される問合せ言語です。
この章の内容は次のとおりです。
第IV部「Oracle CQLの使用」に説明されている文を使用する前に、この章で説明する概念を理解しておく必要があります。
Oracle Event Processingによって操作される各値には、データ型があります。値のデータ型により、プロパティの固定セットがその値に関連付けられます。これらのプロパティにより、Oracle Event Processingでは、あるデータ型の値が別のデータ型の値とは異なる処理をされます。たとえば、INTEGER
データ型の値は追加できますが、CHAR
データ型の値は追加できません。ストリームを作成する場合、その要素ごとにデータ型を指定する必要があります。ユーザー定義関数を作成する場合、その引数ごとにデータ型を指定する必要があります。これらのデータ型によって、各要素または各引数が含むことのできる値の範囲を定義します。たとえば、データ型としてTIMESTAMP
を持つ属性は、値「2月29日」(うるう年を除く)や、値「2」または「SHOE」を保持できません。Oracle CQLでは、多くの組込みデータ型を使用できます。Oracle CQLデータ型の構文は、後続の図に記載されています。
Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、Oracle CQLデータ・カートリッジまたはユーザー定義関数を作成してOracle CQL問合せでそのデータ型を評価できます。
詳細は、次を参照してください。
datatype::=
variable_length_datatype::=
fixed_length_datatype::=
表2-1は、Oracle CQL組込みデータ型の概要を示しています。構文の要素については、前の項の構文を参照してください。
イベント・タイプを定義する場合は、これらのデータ型およびデータ型リテラルの制限を検討します。詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processingイベント・タイプの作成に関する項を参照してください。
表2-1 Oracle CQL組込みデータ型の概要
Oracle CQLデータ型 | 説明 |
---|---|
|
Java 詳細は、2.3.2項「数値リテラル」を参照してください。 |
|
Java |
|
長さが 詳細は、2.3.2項「数値リテラル」を参照してください。 |
|
長さが 詳細は、2.3.1項「テキスト・リテラル」を参照してください。 |
|
Java 詳細は、2.3.2項「数値リテラル」を参照してください。 |
|
Java 詳細は、2.3.2項「数値リテラル」を参照してください。 |
|
Java 詳細は、2.3.2項「数値リテラル」を参照してください。 |
|
固定長の 詳細は、2.3.4項「期間リテラル」を参照してください。 |
|
固定長の 詳細は、2.3.3項「日時リテラル」を参照してください。 |
|
このデータ型は、XMLデータを含むストリーム要素に使用します。最大長は4096文字です。
詳細は、「SQL/XML (SQLX)」を参照してください。 |
|
任意のJavaオブジェクト(つまり、 Oracle Event Processingエンジンでは 通常、この型はアダプタから宛先に値をそのまま渡す場合に使用します。Oracle Event Processingエンジンではこれらの値を解釈する必要はありませんが( |
脚注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 Event Processingでの各データ型の値の比較方法について説明します。
後の日付は前の日付よりも大きいと見なされます。たとえば、'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 Event Processingでは、あるデータ型から別のデータ型への暗黙的および明示的な値の変換がサポートされています。
暗黙的または自動的な変換に依存するかわりに、Oracleでは明示的な変換の指定をお薦めします。これは、次の理由によります。
明示的なデータ型変換関数を使用すると、Oracle CQL文が読みやすくなります。
暗黙的なデータ型変換はパフォーマンスに悪影響を及ぼす可能性があります。
暗黙的な変換は発生したコンテキストに依存し、すべてのケースで同じように動作しない可能性があります。
暗黙的な変換のアルゴリズムはソフトウェア・リリース間やOracle製品間で変更される場合があります。明示的な変更では、動作がより安定しています。
この項の内容は、次のとおりです。
Oracle Event Processingでは、変換に意味がある場合に、あるデータ型から別のデータ型に値が自動的に変換されます。
表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 Event Processingで暗黙のデータ型変換が行われる方向を決定します。
SELECT
FROM
操作で、Select句に算術式または条件の評価が含まれている場合、Oracle Event Processingではストリームのデータがターゲット変数の型に変換されます。
たとえば、c1+2.0
などの式評価やc1 < 2.0
などの条件評価のコンテキストでc1
がINTEGER
型である場合に、暗黙的な変換が発生します。
FLOAT
からBIGINT
への変換は正確です。
BIGINT
値が使用する精度のビット数がFLOAT
でサポートされる数を超えている場合、BIGINT
からFLOAT
への変換は正確ではありません。
文字値とTIMESTAMP
値を比較する場合、Oracle Event Processingでは文字データがTIMESTAMP
に変換されます。
Oracle CQL関数または演算子で許可されていないデータ型の引数を使用すると、Oracle Event Processingではサポートされている場合は必ず、引数が使用可能なデータ型に変換されます。
代入時、Oracle Event Processingでは等号(=
)の右側の値が、左側の代入対象のデータ型に変換されます。
連結操作時、Oracle Event Processingでは文字以外のデータ型がCHAR
に変換されます。
文字データ型と文字以外のデータ型の間で算術演算または比較を行う場合、Oracle Event Processingでは数値型が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 Event Processingでサポートされる同等のSQLおよびOracle Event Processingデータ型に注意を払う必要があります。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のSQL列の型とそれに対応するOracle Event Processing型に関する項
実行時、Oracle Event Processingではデータ・カートリッジの実装に応じて、Oracle CQLとデータ・カートリッジのデータ型との間でマッピングが行われます。
詳細は、次を参照してください。
Oracle Javaデータ・カートリッジ: 15.1.4項「データ型マッピング」
Oracle Spatial: 16.1.3項「データ型マッピング」
実行時、Oracle Event Processingでは、ユーザー定義関数の戻り値の型に指定したOracle CQLデータ型とJavaの同等のデータ型との間でマッピングが行われます。
詳細は、13.1.2項「ユーザー定義関数のデータ型」を参照してください。
「リテラル」と「定数値」という用語は同義語であり、固定されたデータ値を表します。たとえば、'JACK'
、'BLUE ISLAND'
および'101'
はすべてテキスト・リテラルであり、5001は数値リテラルです。
Oracle Event Processingは、Oracle CQL文の次の種類のリテラルがサポートされています。
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文の構文でconst_string
、quoted_string_double_quotes
またはquoted_string_single_quotes
と示されている箇所では常にテキスト・リテラルの表記で値を指定します。このリファレンスでは、テキスト・リテラル、文字リテラルおよび文字列という用語を区別なく使用しています。
テキスト・リテラルは、Oracle Event Processingでスキーマ・オブジェクト名と区別されるように、一重引用符または二重引用符で囲みます。
一重引用符('
)または二重引用符("
)を使用できます。通常は、二重引用符を使用します。ただし、特定の式、条件、関数および文では、このリファレンスの他の部分で指定されている構文に従って、quoted_string_double_quotes
またはquoted_string_single_quotes
のいずれかの引用符を使用する必要があります。
構文で単にconst_string
と示されている場合は、一重引用符または二重引用符のどちらでも使用できます。
構文でchar
という用語が示されている場合は、テキスト・リテラルを指定するか、または文字データに解決される別の式を指定できます。構文でchar
と示されている場所では、一重引用符は使用しません。
Oracle Event ProcessingではJavaローカリゼーションがサポートされています。Javaロケールで指定された文字セットのテキスト・リテラルを指定できます。
詳細は、次を参照してください。
固定長の数値または浮動小数点数値を指定する場合は、数値リテラルの表記を使用します。
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数、およびOracle CQL文でinteger
と示されている箇所では常に整数表記を使用して整数を指定する必要があります。
integer
の構文は次のとおりです。
integer::=
digit
は0、1、2、3、4、5、6、7、8、9のいずれかです。
整数は最大32桁の精度を格納できます。
次に、有効な整数を示します。
7 +255
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文でnumber
またはn
と示されている箇所では、常に数または浮動小数点数の表記を使用して値を指定する必要があります。
number
の構文は次のとおりです。
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 Event ProcessingでINTEGER
が所定の型である場合に文字列'9'
が検出されると、文字列はJava Integer
9に変換されます。ただし、Oracle Event Processingで文字列'9f'
が検出された場合は、変換が失敗しエラーが返されます。
INTEGER
型の数は最大32桁の精度を格納できます。BIGINT
またはFLOAT
で提供される精度よりも高い精度がリテラルで必要な場合、Oracle Event Processingでは値が切り詰められます。リテラルの範囲がBIGINT
またはFLOAT
でサポートされる範囲を超えた場合、Oracle Event Processingではエラーが発生します。
Javaロケールでピリオド(.
)以外の小数点を使用している場合は、'text'
表記を使用して数値リテラルを指定する必要があります。この場合、Oracle Event Processingではテキスト・リテラルが自動的に数値に変換されます。
注意: この表記は、浮動小数点数リテラルでは使用できません。 |
たとえば、Javaロケールでカンマ(,)の小数点が指定されている場合は、次のように数値5.123を指定します。
'5,123'
次に、有効なNUMBER
リテラルを示します。
25 +6.34 0.5 -1
次に、有効な浮動小数点数リテラルを示します。
25f +6.34F 0.5d -1D
Oracle Event Processingでは、日時データ型TIMESTAMP
がサポートされています。
日時リテラルは64バイトを超えることはできません。
すべての日時リテラルは、Oracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルのいずれかに準拠している必要があります。詳細は、2.4.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.4.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 Event Processingでは期間リテラルDAY
TO
SECOND
がサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲(SECOND
やMINUTE to SECOND
など)はサポートされていません。
期間リテラルは64バイトを超えることはできません。
次の構文を使用して、DAY
TO
SECOND
期間リテラルを指定します。
interval_value::=
const_string
は、適切な日時書式モデルに準拠するTIMESTAMP
値です(2.4.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 Event Processingでの文字列の解釈のしかたは書式モデルによって決まります。Oracle CQL問合せに関連する次の書式モデルがあります。
次の関数で、数値書式モデルを使用できます。
Oracle CQLではjava.text.SimpleDateFormat
が指定する書式モデルがサポートされています。
表2-4は、Oracle CQLがTIMESTAMP
リテラルの解釈に使用するjava.text.SimpleDateFormat
モデルを示しています。詳細は、2.3.3項「日時リテラル」を参照してください。
表2-4 日時書式モデル
書式モデル | 例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
次の関数で、日時書式モデルを使用できます。
to_timestamp
: char
データ型の値をTIMESTAMP
データ型に変換します。
列の行に値がない場合、その列はnullである、またはnullを含んでいると言います。主キー整合性制約によって制限されていない任意のデータ型のタプルでは、nullが含まれている場合があります。実際の値が不明な場合や、値が意味を持たない場合はnullを使用します。
現在、Oracle Event Processingでは長さ0の文字値がnullとして処理されます。ただし、数値0を表すのにnullを使用しないでください。この2つは等価ではありません。
注意: 現在、Oracle Event Processingでは長さ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 Event Processingでは、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
に評価される条件を使用する場合、問合せで返される行はありません。
表2-5 Nullを使用する条件
条件 | Aの値 | 評価 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
詳細は、6.6項「Null条件」を参照してください。
Oracle CQLではコメントはサポートされていません。
Oracle CQLでは、問合せを簡易化してわかりやすくするために、別名(またはシノニム)を定義できます。
この項の内容は、次のとおりです。
AS
演算子を使用すると、Oracle CQLで問合せ、リレーション、ストリームおよび問合せのSELECT
リスト項目の別名を指定できます。
この項の内容は、次のとおりです。
詳細は、第20章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
relation_variable
句のAS
演算子で別名を定義して選択リストの直前の式にラベルを付け、その名前で結果を参照できます。別名によって、問合せの期間中にselectリストの項目名が効率的に変更されます。別名は、ORDER
BY
句(20.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>
詳細は、20.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 Event Processingで例外がスローされます。
問合せまたはビュー定義が別名を参照している場合、別名はすでに存在する必要があります。
この項の内容は、次のとおりです。
aliases
要素の子要素type-alias
を使用して、データ型の別名を定義できます。任意の組込みまたはデータ・カートリッジ・データ型の別名を作成できます。
詳細は、2.1項「データ型」を参照してください。
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.8項「スキーマ・オブジェクト名と修飾子」を参照してください。
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 Event Processingの各オブジェクトには名前があります。Oracle CQL文では、オブジェクト名は引用符なしの識別子で表します。つまり、なんらかの記号で囲まれていない識別子を使用します。
Oracle Event Processingオブジェクトの名前を指定する場合、引用符なしの識別子を使用する必要があります。
次に、識別子に適用されるルールのリストを示します。
Oracle Event Processingの予約語は、識別子として使用できません。
Oracle Event Processingオブジェクトへのアクセスに使用するOracle製品によっては、製品固有の予約語により名前がさらに制限される可能性があります。
Oracle CQL言語には特殊な意味を持つ他の語が含まれています。これらの語は予約語ではありません。しかし、これらは内部的に特殊な方法で使用されます。このため、これらの語をオブジェクトやオブジェクトの各部分の名前として使用すると、Oracle CQL文が読みにくくなり、予期しない結果が生じることがあります。
詳細は、次を参照してください。
異なるプラットフォームまたはオペレーティング・システム間で最適な互換性が提供されるため、スキーマ・オブジェクト名にASCII文字を使用することをお薦めします。
識別子は、データベース文字セットのアルファベット文字で開始する必要があります。
識別子にはJavaロケールの文字セットの英数字とアンダースコア(_)のみを使用できます。特に、スペース、ドット、スラッシュは使用できません。
詳細は、次を参照してください。
通常、次のオブジェクトでは、アプリケーションで一意の名前を選択する必要があります。
ストリーム
問合せ
ビュー
ユーザー定義関数
特に、問合せとビューに同じ名前を付けることはできません。
識別子名では大文字と小文字が区別されます。
同一のストリームまたはビューのストリーム要素には同じ名前を使用できません。ただし、異なるストリームまたはビューのストリーム要素には同じ名前を使用できます。
関数の引数の個数およびデータ型が異なる(つまり、シグネチャが固有である)場合は、関数に同じ名前を使用できます。引数の異なる同名の関数を複数作成することは、関数のオーバーロードと呼ばれます。
組込み関数と同じ名前とシグネチャを持つユーザー定義関数を登録または作成すると、ユーザー関数が組込み関数のシグネチャに取ってかわります。組込み関数と同じ名前とシグネチャを持つ関数を作成することは、関数のオーバーライドと呼ばれます。
組込み関数はパブリックですが、ユーザー定義関数は特定のスキーマに属しています。
詳細は、次を参照してください。
次に、オブジェクトおよび各部分に名前を付ける場合のガイドラインを示します。
完全な、わかりやすい、発音可能な名前(またはよく知られた略語)を使用します。
一貫性のあるネーミング・ルールを使用します。
ストリーム、ビュー、および問合せ間で同一のエンティティまたは属性を記述するには、同じ名前を使用します。
オブジェクトに名前を付ける場合、名前を短くして使いやすくするという目的と、名前をできるかぎり説明的にするという目的を両立させてください。Oracle Event Processingのオブジェクトは長期間にわたり多くのユーザーによって使用される可能性があるため、確信が持てない場合はより説明的な名前を選択してください。10年後のユーザーは、payment_due_date
ではなくpmdd
という名前を持つストリーム要素の理解に苦しむ可能性があります。
一貫性のあるネーミング・ルールを使用すると、アプリケーションでの各ストリームの役割が理解しやすくなります。このようなルールとして、FINANCE
アプリケーションに属するすべてのストリーム名をfin_
で開始するなどがあります。
ストリーム間で同一の項目を記述するには、同じ名前を使用します。たとえば、employees
およびdepartments
ストリームでは、どちらも部門番号のストリーム要素にdepartment_id
という名前を付けます。
次に、有効なスキーマ・オブジェクト名の例を示します。
last_name horse a_very_long_and_valid_name
これらの例はすべて2.8.1項「スキーマ・オブジェクトのネーミング・ルール」のルールに従っています。