2 Oracle CQLの基本要素
Oracle Continuous Query Language (Oracle CQL)の基本部分(データ型、リテラル、nullなど)のリファレンスを提供します。Oracle CQLは、提供されているOracle Stream Analyticsアプリケーションで使用される問合せ言語です。
2.1 データ型
Oracle Event Processingによって操作される各値には、データ型があります。値のデータ型により、固定された一連のプロパティが値に関連付けられます。これらのプロパティにより、Oracle Event Processingでは、あるデータ型の値が別のデータ型の値とは異なる処理をされます。たとえば、INTEGER
データ型の値は加算できますが、CHAR
データ型の値は加算できません。ストリームを作成するときは、その要素ごとにデータ型を指定する必要があります。ユーザー定義関数を作成するときは、その引数ごとにデータ型を指定する必要があります。これらのデータ型によって、各要素または各引数が含むことのできる値の範囲を定義します。たとえば、データ型としてTIMESTAMP
を持つ属性は、値「2月29日」(うるう年を除く)や、値「2」または「SHOE」を保持できません。Oracle CQLでは、多くの組込みデータ型を使用できます。Oracle CQLデータ型の構文は、後続の図に記載されています。
Oracle CQLでサポートされていないデータ型をイベントで使用する場合は、Oracle CQLデータ・カートリッジまたはユーザー定義関数を使用して、Oracle CQL問合せでそのデータ型を評価できます。
詳細については、以下を参照:
datatype::=
![データ型 データ型](img/datatype.png)
variable_length_datatype::=
![可変長のデータ型 可変長のデータ型](img/variable_length_datatype.png)
fixed_length_datatype::=
![固定長のデータ型 固定長のデータ型](img/fixed_length_datatype.png)
2.1.1 Oracle CQL組込みデータ型
表2-1は、Oracle CQL組込みデータ型の概要を示しています。構文要素については、前の項の構文を参照してください。
イベント・タイプを定義するときは、これらのデータ型およびデータ型リテラルの制限を検討します。
表2-1 Oracle CQL組込みデータ型の概要
Oracle CQLデータ型 | 説明 |
---|---|
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
Java |
|
長さが 詳細は、「数値リテラル」を参照してください。 |
Oracle CQLでは1次元配列のみをサポートしています。 |
長さが 詳細は、「テキスト・リテラル」を参照してください。 |
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
固定長の 詳細は、「期間リテラル」を参照してください。 |
|
固定長の 詳細は、「日時リテラル」を参照してください。 |
|
このデータ型は、XMLデータを含むストリーム要素に使用します。最大長は4096文字です。
詳細は、「SQL/XML (SQLX)」を参照してください。 |
|
任意のJavaオブジェクト(つまり、 Oracle Event Processingエンジンでは 通常、この型はアダプタから宛先に値をそのまま渡す場合に使用します。Oracle Event Processingエンジンではこれらの値を解釈する必要はありませんが( |
2.1.2 Oracle CQLデータ・カートリッジを使用した他のデータ型の処理
Oracle CQLでサポートされていないデータ型をイベントで使用する場合は、Oracle CQLデータ・カートリッジを使用して、Oracle CQL問合せでそのデータ型を評価できます。
2.1.3 ユーザー定義関数を使用した他のデータ型の処理
Oracle CQLでサポートされていないデータ型をイベントで使用する場合は、ユーザー定義関数を作成して、Oracle CQL問合せでそのデータ型を評価できます。
package com.oracle.app; public enum ProcessStatus { OPEN(1), CLOSED(0)} }
package com.oracle.app; import com.oracle.capp.ProcessStatus; public class ServiceOrder { private String serviceOrderId; private String electronicSerialNumber; private ProcessStatus status; ... }
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; } }
<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>
<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>
詳細は、「ユーザー定義」を参照してください。
2.2 データ型の比較規則
この項では、Oracle Event Processingでの各データ型の値の比較方法について説明します。
2.2.2 日付値
後の日付は前の日付よりも大きいと見なされます。たとえば、'29-MAR-2005'
に等しい日付は'05-JAN-2006'
に等しい日付より小さく、'05-JAN-2006 1:35pm'
は'05-JAN-2005 10:09am'
より大きくなります。
2.2.3 文字値
Oracle CQLでは辞書順に基づいた辞書的ソートがサポートされています。
内部的には、Oracle CQLではchar
の数値が比較されます。使用するエンコーディングに応じて数値は異なりますが、通常は、比較する際に違いはありません。次に例を示します。
'a' < 'b' 'aa' < 'ab' 'aaaa' < 'aaaab'
2.2.4 データ型変換
通常、式では異なるデータ型の値を使用できません。たとえば、算術式で5 × 10の乗算の後に'JAMES'
を加算することはできません。ただし、Oracle Event Processingでは、あるデータ型から別のデータ型への暗黙的および明示的な値の変換がサポートされています。
暗黙的または自動的な変換に依存するかわりに、Oracleでは明示的な変換の指定をお薦めします。これは、次の理由によります。
-
明示的なデータ型変換関数を使用すると、Oracle CQL文が読みやすくなります。
-
暗黙的なデータ型変換はパフォーマンスに悪影響を及ぼす可能性があります。
-
暗黙的な変換はその変換が行われるコンテキストに依存し、どんな場合でも同様に機能するとはかぎりません。
-
暗黙的な変換のアルゴリズムはソフトウェア・リリース間やOracle製品間で変更される場合があります。明示的な変更では、動作がより安定しています。
この項の内容は、次のとおりです。
2.2.4.1 暗黙的なデータ型変換
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を参照)。
2.2.4.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から |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
2.2.4.3 SQLデータ型変換
.
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。その場合は、Oracle Event Processingでサポートされる同等のSQLおよびOracle Event Processingデータ型に注意を払う必要があります。
詳細は、「リレーショナル・データベース表の問合せ」を参照してください。
2.2.4.4 Oracleデータ・カートリッジのデータ型変換
実行時、Oracle Event Processingではデータ・カートリッジの実装に応じて、Oracle CQLとデータ・カートリッジのデータ型との間でマッピングが行われます。
2.2.4.5 ユーザー定義関数のデータ型変換
実行時、Oracle Event Processingではユーザー定義関数の戻り値の型に指定したOracle CQLデータ型とJavaの同等のデータ型との間でマッピングが行われます。
詳細は、「ユーザー定義関数のデータ型」を参照してください。
2.3 リテラル
「リテラル」と「定数値」という用語は同義語であり、固定されたデータ値を表します。たとえば、'JACK'
、'BLUE ISLAND'
および'101'
はすべてテキスト・リテラルであり、5001は数値リテラルです。
Oracle Event Processingでは、Oracle CQL文の次の種類のリテラルがサポートされています。
2.3.1 テキスト・リテラル
このリファレンスの他の部分で説明している式、条件、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ロケールで指定された文字セットのテキスト・リテラルを指定できます。
詳細については、以下を参照:
2.3.2 数値リテラル
固定長の数値または浮動小数点数値を指定する場合は、数値リテラルの表記を使用します。
2.3.2.1 整数リテラル
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数、およびOracle CQL文でinteger
と示されている箇所では常に整数表記を使用して整数を指定する必要があります。
integer
の構文は次のとおりです。
integer::=
![integer integer](img/integer.png)
digit
は0、1、2、3、4、5、6、7、8、9のいずれかです。
整数は最大32桁の精度を格納できます。
次に、有効な整数を示します。
7 +255
2.3.2.2 浮動小数点リテラル
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文でnumber
またはn
と示されている箇所では、常に数または浮動小数点数の表記を使用して値を指定する必要があります。
number
の構文は次のとおりです。
number::=
![number number](img/number.png)
説明:
-
+は正、-は負の値を示します。符号を省略すると、デフォルトで正の値になります。
-
digit
は0、1、2、3、4、5、6、7、8、9のいずれかです。 -
f
またはF
は数値がFLOAT
型の32ビット・バイナリ浮動小数点数であることを示します。 -
d
またはD
は、数値がDOUBLE
型の64ビット・バイナリ浮動小数点数であることを示します。pcbpel/cep/src/oracle/cep/common/Constants.BIGINT_LENGTHf
またはF
およびd
またはD
を省略すると、数値は型INTEGER
になります。接尾辞
f
またはF
およびd
またはD
は浮動小数点数リテラルでのみサポートされ、INTEGER
に変換される文字列ではサポートされていません。たとえば、Oracle Event ProcessingでINTEGER
が所定の型である場合に文字列'9'
が検出されると、文字列はJavaInteger
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
2.3.3 日時リテラル
Oracle Event Processingでは、日時データ型TIMESTAMP
がサポートされています。
日時リテラルは64バイトを超えることはできません。
すべての日時リテラルは、Oracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルのいずれかに準拠している必要があります。詳細は、「日時書式モデル」を参照してください。
現在、SimpleDateFormat
クラスではxsd:dateTime
がサポートされていません。このため、Oracle CQLではこの型を使用するXML要素または属性がサポートされていません。
たとえば、XMLイベントがXSDを使用する場合、Oracle CQLではMyTimestamp
要素を解析できません。
<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
で置き換えることをお薦めします。
<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>
XSDを使用すると、Oracle CQLでは、Timestamp
要素のString
値がOracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルに準拠しているかぎりイベントを処理できます。詳細は、「日時書式モデル」を参照してください。
<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)」を参照してください。
2.3.4 期間リテラル
期間リテラルは期間を指定します。Oracle Event Processingでは、期間リテラルDAY
TO
SECOND
がサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲(SECOND
やMINUTE to SECOND
など)はサポートされていません。
期間リテラルは64バイトを超えることはできません。
pcbpel/cep/src/oracle/cep/common/Constants.BIGINT_LENGTH
2.3.4.1 INTERVALDAYTOSECOND
日、時、分および秒の単位で時間が格納されます。
次の構文を使用して、DAY
TO
SECOND
期間リテラルを指定します。
interval_value::=
![interval value interval value](img/interval_value.png)
const_string
は、適切な日時書式モデルに準拠するTIMESTAMP
値です(「日時書式モデル」を参照)。
先行フィールドに対する制限:
後続のフィールドを指定する場合、先行のフィールドよりも下位の単位を指定する必要があります。たとえば、INTERVAL
MINUTE
TO
DAY
は無効です。このため、SECOND
が先行フィールドの場合、期間リテラルは後続フィールドを持つことができません。
後続フィールドの有効範囲は次のとおりです。
-
SECOND
: 0から59.999999999
INTERVAL
DAY
TO
SECOND
リテラルの書式の例を示します。
期間リテラルの形式 | 解釈 |
---|---|
|
4日、5時間、12分、10秒、222ミリ秒。 |
あるDAY
TO
SECOND
期間リテラルを別のDAY
TO
SECOND
リテラルと加算または減算したり、期間リテラルを比較したりできます。この例で、ストリームtkdata2_SIn1
のスキーマは(c1 integer, c2 interval)
です。
<query id="tkdata2_q295"><![CDATA select * from tkdata2_SIn1 where (c2 + INTERVAL "2 1:03:45.10" DAY TO SECOND) > INTERVAL "6 12:23:45.10" DAY TO SECOND ]]></query>
パターン一致のDEFINE句でのINTERVAL DAY TO SECOND
の使用:
query 'select its.itemId from ch0
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 "00:00:05.00" HOUR TO SECOND)),
C AS (to_timestamp(C.element_time) - to_timestamp(A.element_time)
>= INTERVAL "00:05.00" MINUTE TO SECOND)
) as its'
入力:
send [itemId=2 temp=30]
send [itemId=2 temp=55]
thread:sleep 5000
send [itemId=2 temp=125]
出力:
-> insert event: {itemId=2}
2.3.4.2 INTERVALYEARTOMONTH
時間を年および月の単位で格納します。
INTERVALYEARTOMONTH
リテラルの書式の例を示します。
期間リテラルの形式 | 解釈 |
---|---|
|
12年10か月 |
注意:
問合せのDDLで使用する場合、CQL問合せで定数を指定するにはINTERVAL YEAR TO MONTH
通知を使用します。変数のかわりに、定数の間隔値を指定します。
次に示すコード・サンプルでは、次にリストするタプルを使用しています。
<event-type type-name="IntervalInputTupleEvent">
<properties>
<property name="interval_inputevent" type="interval year to month"/>
</properties>
</event-type>
<event-type type-name="IntervalOutputTupleEvent">
<properties>
<property name="interval_outputevent" type="interval year to month"/>
</properties>
</event-type>
次に示すのは、INTERVAL YEARS TO MONTH
のサンプル問合せです。
問合せ:
select interval_inputevent as interval_outputevent from inputChannel
入力:
send [interval_inputevent='INTERVAL "212-10" YEAR(3) TO MONTH']
出力:
-> insert event: {interval_outputevent=+212-10}
2.4 書式モデル
書式モデルは、格納された日時または数値データの書式を文字列で記述する文字リテラルです。文字列を日付または数値に変換する場合、Oracle Event Processingでの文字列の解釈のしかたは書式モデルによって決まります。Oracle CQL問合せに関連する次の書式モデルがあります。
2.4.1 数値書式モデル
次の関数で、数値書式モデルを使用できます。
-
関数で
int
データ型の値をbigint
データ型に変換します。 -
to_float
関数でint
またはbigint
データ型の値をfloat
データ型に変換します。
2.4.2 日時書式モデル
Oracle CQLではjava.text.SimpleDateFormat
が指定する書式モデルがサポートされています。
表2-4は、Oracle CQLがTIMESTAMP
リテラルの解釈に使用するjava.text.SimpleDateFormat
モデルを示しています。詳細は、「日時リテラル」を参照してください。
表2-4 日時書式モデル
書式モデル | 例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
次の関数で、日時書式モデルを使用できます。
-
to_timestamp
:char
データ型の値をTIMESTAMP
データ型に変換します。
2.5 NULL
行のある列の値がない場合、その列はNULLである、またはNULLを含むといいます。主キー整合性制約によって制限されていない任意のデータ型のタプルでは、nullが含まれている場合があります。実際のデータ値が不定または値に意味がない場合に、NULLを使用してください。
Oracle Event Processingでは、長さゼロの文字値はそのままの状態で扱われます(SQLとは異なります)。ただし、数値0を表すのにnullを使用しないでください。この2つは等価ではありません。
nullを含む算術式は常にnullに評価されます。たとえば、10にnullを加算したものはnullです。実際、nullオペランドを指定すると、すべての演算子ではnullが返されます(連結を除く)。
詳細については、以下を参照:
2.5.1 Oracle CQL関数での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
のように計算されます。
2.5.2 比較条件でのNull
nullをテストするには、null比較条件のみを使用します(「null_conditions::=」を参照)。それ以外の条件をnullで使用すると、結果がnull値に依存し、結果がUNKNOWN
になります。NULLはデータの欠落を表すため、任意の値や別のNULLとの関係で等号や不等号は成り立ちません。ただし、Oracle Event Processingでは、decode式の評価時に2つのnullが等価であると見なされます。構文と追加情報については、decode::=を参照してください。
2.5.3 条件でのNull
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の値 | 評価 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
詳細は、「Null条件」を参照してください。
2.7 別名
Oracle CQLでは、問合せを簡易化してわかりやすくするために、別名(またはシノニム)を定義できます。
この項の内容は、次のとおりです。
2.7.1 AS演算子を使用した別名の定義
AS
演算子を使用すると、Oracle CQLで問合せ、リレーション、ストリームおよび問合せのSELECT
リスト項目の別名を指定できます。
この項の内容は、次のとおりです。
詳細は、「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
2.7.1.1 relation_variable句の別名
relation_variable
句のAS
演算子で別名を定義して選択リストの直前の式にラベルを付け、その名前で結果を参照できます。別名によって、問合せ中にSELECT構文のリストの項目名を効果的に変更できます。別名は、ORDER
BY
句(「問合せ結果のソート」を参照)で使用できますが、問合せの他の句では使用できません。
次の例は、SELECT
リストのストリーム要素its.itemId
に対して別名badItem
、MATCH_RECOGNIZE
句に対して別名its
を定義する方法を示しています。
<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>
詳細は、「From句」を参照してください。
2.7.1.2 ウィンドウ演算子の別名
AS
演算子で別名を定義して直前のウィンドウ演算子にラベルを付け、その名前で結果を参照できます。
ウィンドウ演算子の内部ではAS
演算子を使用できませんが、ウィンドウ演算子の外部ではAS
演算子を使用できます。
次の例は、分割範囲のウィンドウ演算子の後で別名bidとaskを定義する方法を示しています。
<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>
詳細は、「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。
2.7.2 Aliases要素を使用した別名の定義
別名はロケーションの透過性を提供するために必要です。aliases
要素で別名を定義して、Oracle CQLの問合せやビューで使用できます。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により例外がスローされます。
-
問合せまたはビュー定義が別名を参照している場合、別名はすでに存在する必要があります。
この項の内容は、次のとおりです。
2.7.2.1 Aliases要素を使用してデータ型の別名を定義する方法
aliases
要素の子要素type-alias
を使用して、データ型の別名を定義できます。任意の組込みまたはデータ・カートリッジ・データ型の別名を作成できます。
詳細は、「データ型」を参照してください。
aliases要素を使用してalias型を定義するには:
2.8 スキーマ・オブジェクト名および修飾子
一部のスキーマ・オブジェクトは、ストリームまたはビューのストリーム要素、整合性制約、ストリーム、ビューおよびユーザー定義の関数またはユーザー定義のウィンドウなどの、ユーザーが指定できる部分または指定する必要のある部分で構成されています。この項の内容は、次のとおりです。
詳細は、「表記規則」を参照してください。
2.8.1 スキーマ・オブジェクトのネーミング・ルール
Oracle Event Processingの各オブジェクトには名前があります。Oracle CQL文では、オブジェクト名は引用符なしの識別子で表します。つまり、なんらかの記号で囲まれていない識別子を使用します。
Oracle Event Processingオブジェクトの名前を指定する場合は、引用符なしの識別子を使用する必要があります。
次に、識別子に適用されるルールのリストを示します。
-
Oracle Event Processingの予約語は、識別子として使用できません。
Oracle Event Processingオブジェクトへのアクセスに使用するOracle製品によっては、製品固有の予約語により名前がさらに制限される可能性があります。
Oracle CQL言語には特殊な意味を持つ他の語が含まれています。これらの文字は予約語ではありません。ただし、Oracleは固有の方法でこれらの文字を内部的に使用します。このため、これらの語をオブジェクトやオブジェクトの各部分の名前として使用すると、Oracle CQL文が読みにくくなり、予期しない結果が生じることがあります。
詳細については、以下を参照:
-
識別子。
-
-
異なるプラットフォームまたはオペレーティング・システム間で最適な互換性が提供されるため、スキーマ・オブジェクト名にASCII文字を使用することをお薦めします。
-
識別子は、データベース文字セットのアルファベット文字で開始する必要があります。
-
識別子にはJavaロケールの文字セットの英数字とアンダースコア(_)のみを使用できます。特に、スペース、ドット、スラッシュは使用できません。
詳細については、以下を参照:
-
通常、次のオブジェクトでは、アプリケーションで一意の名前を選択する必要があります。
-
Streams
-
問合せ
-
ビュー
-
ユーザー定義関数。
特に、問合せとビューに同じ名前を付けることはできません。
-
-
識別子名では大文字と小文字が区別されます。
-
同一のストリームまたはビューのストリーム要素には同じ名前を使用できません。ただし、異なるストリームまたはビューのストリーム要素には同じ名前を使用できます。
-
関数の引数の個数およびデータ型が異なる(つまり、シグネチャが固有である)場合は、関数に同じ名前を使用できます。引数の異なる同名の関数を複数作成することは、関数のオーバーロードと呼ばれます。
組込み関数と同じ名前とシグネチャを持つユーザー定義関数を登録または作成すると、ユーザー関数が組込み関数のシグネチャに取ってかわります。組込み関数と同じ名前とシグネチャを持つ関数を作成することは、関数のオーバーライドと呼ばれます。
組込み関数はパブリックですが、ユーザー定義関数は特定のスキーマに属しています。
詳細については、以下を参照:
2.8.2 スキーマ・オブジェクトのネーミングのガイドライン
次に、オブジェクトおよび各部分に名前を付ける場合のガイドラインを示します。
-
完全な、わかりやすい、発音可能な名前(またはよく知られた略語)を使用します。
-
一貫性のあるネーミング・ルールを使用します。
-
ストリーム、ビュー、および問合せ間で同一のエンティティまたは属性を記述するには、同じ名前を使用します。
オブジェクトに名前を付ける場合、名前を短くして使いやすくするという目的と、名前をできるかぎり説明的にするという目的を両立させてください。Oracle Event Processingのオブジェクトは長期間にわたり多くのユーザーによって使用される可能性があるため、確信が持てない場合はより説明的な名前を選択してください。10年後のユーザーは、payment_due_date
ではなくpmdd
という名前を持つストリーム要素の理解に苦しむ可能性があります。
一貫性のあるネーミング・ルールを使用すると、アプリケーションでの各ストリームの役割が理解しやすくなります。このようなルールとして、FINANCE
アプリケーションに属するすべてのストリーム名をfin_
で開始するなどがあります。
ストリーム間で同一の項目を記述するには、同じ名前を使用します。たとえば、employees
およびdepartments
ストリームでは、どちらも部門番号のストリーム要素にdepartment_id
という名前を付けます。
2.8.3 スキーマ・オブジェクトのネーミング例
次に、有効なスキーマ・オブジェクト名の例を示します。
last_name horse a_very_long_and_valid_name
これらのすべての例は、「スキーマ・オブジェクトのネーミング・ルール」のルールに従っています。