2 Oracle CQLの基本要素
この章は、データ型、リテラル、nullなどの基本的なOracle CQL要素のリファレンスです。
2.1 データ型
GGSAが処理する値には、それぞれデータ型があります。値のデータ型により、固定された一連のプロパティが値に関連付けられます。GGSAでは、このプロパティに応じて、あるデータ型の値が別のデータ型の値と区別して扱われます。たとえば、INTEGER
データ型の値は加算できますが、CHAR
データ型の値は加算できません。ストリームを作成する際は、各要素のデータ型を指定する必要があります。
詳細については、以下を参照:
datatype::=

variable_length_datatype::=

fixed_length_datatype::=

2.1.1 Oracle CQL組込みデータ型
表2-1は、Oracle CQL組込みデータ型の概要を示しています。構文要素については、前の項の構文を参照してください。
イベント・タイプを定義するときは、これらのデータ型およびデータ型リテラルの制限を検討します。
表2-1 Oracle CQL組込みデータ型の概要
Oracle CQLデータ型 | 説明 |
---|---|
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
Java |
Oracle CQLでは1次元配列のみをサポートしています。 |
長さが 詳細は、「テキスト・リテラル」を参照してください。 |
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
Java 詳細は、「数値リテラル」を参照してください。 |
|
固定長の 詳細は、「期間リテラル」を参照してください。 |
|
固定長の 詳細は、「日時リテラル」を参照してください。 |
2.2 データ型の比較規則
この項では、GGSAで各データ型の値がどのように比較されるかを説明します。
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'
を加算することはできません。ただし、GGSAでは、値をあるデータ型から別のデータ型に変換する際、暗黙的にも明示的にも変換することができます。
暗黙的または自動的な変換に依存するかわりに、Oracleでは明示的な変換の指定をお薦めします。これは、次の理由によります。
-
明示的なデータ型変換関数を使用すると、Oracle CQL文が読みやすくなります。
-
暗黙的なデータ型変換はパフォーマンスに悪影響を及ぼす可能性があります。
-
暗黙的な変換はその変換が行われるコンテキストに依存し、どんな場合でも同様に機能するとはかぎりません。
-
暗黙的な変換のアルゴリズムはソフトウェア・リリース間やOracle製品間で変更される場合があります。明示的な変更では、動作がより安定しています。
この項の内容は、次のとおりです。
2.2.4.1 暗黙的なデータ型変換
GGSAでは、変換が合理的な場合に、あるデータ型から別のデータ型に値が自動的に変換されます。
表2-2は、Oracleの暗黙的な変換を示しています。この表は、使用可能なすべての変換を示しています(X
マークが付けられています)。サポートされていない変換には--
マークが付けられています。
表2-2 暗黙的な型変換のマトリックス
変換前/変換後 | CHAR | BYTE | BOOLEAN | INTEGER | DOUBLE | BIGINT | FLOAT | TIMESTAMP | INTERVAL |
---|---|---|---|---|---|---|---|---|---|
CHARから |
|
|
|
|
|
|
|
|
|
BYTEから |
|
|
|
|
|
|
|
|
|
BOOLEANから |
|
|
|
|
|
|
|
|
|
INTEGERから |
|
|
|
|
|
|
|
|
|
DOUBLEから |
|
|
|
|
|
|
|
|
|
BIGINTから |
|
|
|
|
|
|
|
|
|
FLOATから |
|
|
|
|
|
|
|
|
|
TIMESTAMPから |
|
|
|
|
|
|
|
|
|
INTERVALから |
|
|
|
|
|
|
|
|
|
次の規則は、GGSAで暗黙的にデータ型が変換される方向を決定します。
-
SELECT
FROM
操作で、Select句に算術式または条件の評価が含まれている場合、GGSAではストリームのデータがターゲット変数の型に変換されます。たとえば、
c1+2.0
などの式評価やc1 < 2.0
などの条件評価のコンテキストでc1
がINTEGER
型である場合に、暗黙的な変換が発生します。 -
FLOAT
からBIGINT
への変換は正確です。 -
BIGINT
値が使用する精度のビット数がFLOAT
でサポートされる数を超えている場合、BIGINT
からFLOAT
への変換は正確ではありません。 -
文字の値と
TIMESTAMP
の値を比較する場合、GGSAでは文字データがTIMESTAMP
に変換されます。 -
GGSAでは、Oracle CQL関数または演算子で許可されていないデータ型の引数を使用すると、サポートされている場合は必ず、引数が使用可能なデータ型に変換されます。
-
代入を実行する場合、GGSAでは、等号(
=
)の右側の値が左側の代入ターゲットのデータ型に変換されます。 -
連結操作時、GGSAでは文字以外のデータ型が
CHAR
に変換されます。 -
文字データ型と文字以外のデータ型の間で算術演算または比較を行う場合、GGSAでは数値型が
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.3 リテラル
「リテラル」と「定数値」という用語は同義語であり、固定されたデータ値を表します。たとえば、'JACK'
、'BLUE ISLAND'
および'101'
はすべてテキスト・リテラルであり、5001は数値リテラルです。
GGSAでは、Oracle CQL文の次の種類のリテラルがサポートされています:
2.3.1 テキスト・リテラル
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文の構文でconst_string
、quoted_string_double_quotes
またはquoted_string_single_quotes
と示されている箇所では常にテキスト・リテラルの表記で値を指定します。このマニュアルでは、 テキスト・リテラル、文字リテラルおよび文字列は同じ用語として使用しています。
テキスト・リテラルは、GGSAでスキーマ・オブジェクト名と区別されるように、一重引用符または二重引用符で囲みます。
一重引用符('
)または二重引用符("
)を使用できます。通常は、二重引用符を使用します。ただし、特定の式、条件、関数および文では、このリファレンスの他の部分で指定されている構文に従って、quoted_string_double_quotes
またはquoted_string_single_quotes
のいずれかの引用符を使用する必要があります。
構文で単にconst_string
と示されている場合は、一重引用符または二重引用符のどちらでも使用できます。
構文でchar
という用語が示されている場合は、テキスト・リテラルを指定するか、または文字データに解決される別の式を指定できます。構文にchar
がある場合、一重引用符で囲む必要はありません。
GGSAではJavaローカリゼーションがサポートされています。Javaロケールで指定された文字セットのテキスト・リテラルを指定できます。
詳細は、const_stringを参照してください
2.3.2 数値リテラル
固定長の数値または浮動小数点数値を指定する場合は、数値リテラルの表記を使用します。
2.3.2.1 整数リテラル
このリファレンスの他の部分で説明している式、条件、Oracle CQL関数、およびOracle CQL文でinteger
と示されている箇所では常に整数表記を使用して整数を指定する必要があります。
integer
の構文は次のとおりです。
integer::=

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::=

説明:
-
+は正、-は負の値を示します。符号を省略すると、デフォルトで正の値になります。
-
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
に変換される文字列ではサポートされていません。たとえば、GGSAでINTEGER
が所定の型である場合に文字列'9'
が検出されると、文字列はJavaInteger
9に変換されます。ただし、文字列'9f'
を使用すると、変換は行われず、エラーが返されます。
INTEGER
型の数は最大32桁の精度を格納できます。リテラルに、BIGINT
またはFLOAT
を超える精度が求められる場合、GGSAでは値が切り捨てられます。リテラルの範囲がBIGINT
またはFLOAT
でサポートされる範囲を超えた場合、GGSAではエラーが発生します。
Javaロケールでピリオド(.
)以外の小数点を使用している場合は、'text'
表記を使用して数値リテラルを指定する必要があります。この場合、GGSAではテキスト・リテラルが自動的に数値に変換されます。
ノート:
この表記は、浮動小数点数リテラルでは使用できません。
たとえば、Javaロケールでカンマ(,)の小数点が指定されている場合は、次のように数値5.123を指定します。
'5,123'
次に、有効なNUMBER
リテラルを示します。
25 +6.34 0.5 -1
次に、有効な浮動小数点数リテラルを示します。
25f +6.34F 0.5d -1D
2.3.3 日時リテラル
GGSAでは、日時データ型TIMESTAMP
がサポートされています。
日時リテラルは64バイトを超えることはできません。
すべての日時リテラルは、Oracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルのいずれかに準拠している必要があります。詳細は、「日時書式モデル」を参照してください。
たとえば、XMLイベントがXSDを使用する場合、Oracle CQLではMyTimestamp
要素を解析できません。
XSDを定義してxsd:dateTime
をxsd:string
で置き換えることをお薦めします。
XSDを使用すると、Oracle CQLでは、Timestamp
要素のString
値がOracle CQLでサポートされるjava.text.SimpleDateFormat
書式モデルに準拠しているかぎりイベントを処理できます。詳細は、「日時書式モデル」を参照してください。
2.3.4 期間リテラル
期間リテラルは期間を指定します。GGSAでは、期間リテラルDAY
TO
SECOND
がサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲(SECOND
やMINUTE to SECOND
など)はサポートされていません。
期間リテラルは64バイトを超えることはできません。
2.3.4.1 INTERVALDAYTOSECOND
日、時、分および秒の単位で時間が格納されます。
次の構文を使用して、DAY
TO
SECOND
期間リテラルを指定します。
interval_value::=

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.4 書式モデル
書式モデルは、格納された日時または数値データの書式を文字列で記述する文字リテラルです。文字列を日付または数値に変換する場合、GGSAが文字列を解釈する方法は、書式モデルによって決まります。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を使用してください。
GGSAでは、SQLとは異なり、長さが0の文字値はそのまま処理されます。ただし、数値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との関係で等号や不等号は成り立ちません。ただし、GGSAで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 別名
2.7.1 AS演算子を使用した別名の定義
AS
演算子を使用すると、Oracle CQLで問合せ、リレーション、ストリームおよび問合せのSELECT
リスト項目の別名を指定できます。
この項の内容は、次のとおりです。
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>
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>
詳細は、「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。