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データ型 説明

BIGINT

Java Long型と同等の固定長数値。

詳細は、「数値リテラル」を参照してください。

BOOLEAN

Java Boolean型と同等の固定長ブール値。有効な値は、trueまたはfalseです。

CHAR[(size)]

Oracle CQLでは1次元配列のみをサポートしています。

長さがsize文字の可変長文字データ。sizeの最大値は4096文字です。デフォルトはsizeの最小値の1文字です。

詳細は、「テキスト・リテラル」を参照してください。

DOUBLE

Java double型と同等の固定長数値。

詳細は、「数値リテラル」を参照してください。

FLOAT

Java float型と同等の固定長数値。

詳細は、「数値リテラル」を参照してください。

INTEGER

Java int型と同等の固定長数値。

詳細は、「数値リテラル」を参照してください。

INTERVAL

固定長のINTERVALデータ型は期間を指定します。GGSAでは、DAY TO SECONDおよびYEAR TO MONTHがサポートされます。最大長は64バイトです。これはlong型に相当します。

詳細は、「期間リテラル」を参照してください。

TIMESTAMP

固定長のTIMESTAMPデータ型は、Oracle CQLでサポートされるjava.text.SimpleDateFormat書式モデルのいずれかに準拠する日時リテラルを格納します。最大長は64バイトです。

詳細は、「日時リテラル」を参照してください。

2.2 データ型の比較規則

この項では、GGSAで各データ型の値がどのように比較されるかを説明します。

2.2.1 数値

多い値は少ない値よりも大きいと見なされます。すべての負の数は0および正の数よりも小さいと見なされます。このため、-1は100より小さく、-100は-1より小さい数です。

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から

--

--

--

--

--

--

--

X

--

BYTEから

X

--

--

--

--

--

--

--

--

BOOLEANから

--

--

X

--

--

--

--

--

--

INTEGERから

X

--

--

--

X

X

X

--

--

DOUBLEから

X

--

--

--

X

--

--

--

--

BIGINTから

X

--

--

--

X

--

X

--

--

FLOATから

X

--

--

--

X

--

--

--

--

TIMESTAMPから

X

--

--

--

--

--

--

--

--

INTERVALから

X

--

--

--

--

--

--

--

--

次の規則は、GGSAで暗黙的にデータ型が変換される方向を決定します。

  • SELECT FROM操作で、Select句に算術式または条件の評価が含まれている場合、GGSAではストリームのデータがターゲット変数の型に変換されます。

    たとえば、c1+2.0などの式評価やc1 < 2.0などの条件評価のコンテキストでc1INTEGER型である場合に、暗黙的な変換が発生します。

  • 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から

--

hextoraw

--

--

--

--

--

to_timestamp

--

BYTEから

--

rawtohex

--

--

--

--

--

--

--

BOOLEANから

--

--

--

--

--

--

--

--

--

INTEGERから

to_char

--

to_boolean

--

to_double

to_bigint

to_float

--

--

DOUBLEから

to_char

--

--

--

--

--

--

--

--

LONGから

--

--

--

--

--

--

--

to_timestamp

--

BIGINTから

to_char

--

to_boolean

--

to_double

--

to_float

--

--

FLOATから

to_char

--

--

--

to_double

--

--

--

--

TIMESTAMPから

to_char

--

--

--

--

--

--

--

--

INTERVALから

to_char

--

--

--

--

--

--

--

--

2.2.4.3 SQLデータ型変換

Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。その場合は、GGSAがサポートするSQLおよびデータ型に対応しているか確認する必要があります。

2.3 リテラル

「リテラル」「定数値」という用語は同義語であり、固定されたデータ値を表します。たとえば、'JACK''BLUE ISLAND'および'101'はすべてテキスト・リテラルであり、5001は数値リテラルです。

GGSAでは、Oracle CQL文の次の種類のリテラルがサポートされています:

2.3.1 テキスト・リテラル

このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文の構文でconst_stringquoted_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::=

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

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_LENGTH

    fまたはFおよびdまたはDを省略すると、数値は型INTEGERになります。

    接尾辞fまたはFおよびdまたはDは浮動小数点数リテラルでのみサポートされ、INTEGERに変換される文字列ではサポートされていません。たとえば、GGSAでINTEGERが所定の型である場合に文字列'9'が検出されると、文字列はJava Integer 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:dateTimexsd:stringで置き換えることをお薦めします。

XSDを使用すると、Oracle CQLでは、Timestamp要素のString値がOracle CQLでサポートされるjava.text.SimpleDateFormat書式モデルに準拠しているかぎりイベントを処理できます。詳細は、「日時書式モデル」を参照してください。

2.3.4 期間リテラル

期間リテラルは期間を指定します。GGSAでは、期間リテラルDAY TO SECONDがサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲(SECONDMINUTE to SECONDなど)はサポートされていません。

期間リテラルは64バイトを超えることはできません。

2.3.4.1 INTERVALDAYTOSECOND

日、時、分および秒の単位で時間が格納されます。

次の構文を使用して、DAY TO SECOND期間リテラルを指定します。

interval_value::=

interval value

const_stringは、適切な日時書式モデルに準拠するTIMESTAMP値です(「日時書式モデル」を参照)。

先行フィールドに対する制限:

後続のフィールドを指定する場合、先行のフィールドよりも下位の単位を指定する必要があります。たとえば、INTERVAL MINUTE TO DAYは無効です。このため、SECONDが先行フィールドの場合、期間リテラルは後続フィールドを持つことができません。

後続フィールドの有効範囲は次のとおりです。

  • SECOND: 0から59.999999999

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リテラルと加算または減算したり、期間リテラルを比較したりできます。この例で、ストリーム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リテラルの書式の例を示します。

期間リテラルの形式 解釈

INTERVAL "12-10" YEAR TO MONTH

12年10か月

ノート:

問合せのDDLで使用する場合、CQL問合せで定数を指定するにはINTERVAL YEAR TO MONTH通知を使用します。変数のかわりに、定数の間隔値を指定します。

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 日時書式モデル

書式モデル

MM/dd/yyyy HH:mm:ss Z

11/21/2005 11:14:23 -0800

MM/dd/yyyy HH:mm:ss z

11/21/2005 11:14:23 PST

MM/dd/yyyy HH:mm:ss

11/21/2005 11:14:23

MM-dd-yyyy HH:mm:ss

11-21-2005 11:14:23

dd-MMM-yy

15-DEC-01

yyyy-MM-dd'T'HH:mm:ss

2005-01-01T08:12:12

次の関数で、日時書式モデルを使用できます。

  • 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が返されます(nvlconcatを除く)。nvl関数を使用すると、nullが発生した場合に値を返すことができます。たとえば、式NVL(commission_pct,0)は、commission_pctがnullの場合に0を返し、nullでない場合にcommission_pctの値を返します。

ほとんどの集計関数ではnullが無視されます。たとえば、1000nullnullnullおよび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 FALSETRUEに評価されますが、NOT UNKNOWNUNKNOWNに評価されます。

表2-5は、条件でnullを使用する場合の様々な評価の例を示しています。SELECT文のWHERE句でUNKNOWNに評価される条件を使用する場合、問合せで返される行はありません。

表2-5 Nullを使用する条件

条件 Aの値 評価

a IS NULL

10

FALSE

a IS NOT NULL

10

TRUE

a IS NULL

NULL

TRUE

a IS NOT NULL

NULL

FALSE

a = NULL

10

FALSE

a != NULL

10

FALSE

a = NULL

NULL

FALSE

a != NULL

NULL

FALSE

a = 10

NULL

FALSE

a != 10

NULL

FALSE

詳細は、「Null条件」を参照してください。

2.6 コメント

Oracle CQLではコメントはサポートされていません。

2.7 別名

Oracle CQLでは、問合せを簡易化してわかりやすくするために、別名(またはシノニム)を定義できます。

この項の内容は、次のとおりです。

2.7.1 AS演算子を使用した別名の定義

AS演算子を使用すると、Oracle CQLで問合せ、リレーション、ストリームおよび問合せのSELECTリスト項目の別名を指定できます。

この項の内容は、次のとおりです。

2.7.1.1 relation_variable句の別名

relation_variable句のAS演算子で別名を定義して選択リストの直前の式にラベルを付け、その名前で結果を参照できます。別名によって、問合せ中にSELECT構文のリストの項目名を効果的に変更できます。ORDER BY句では別名の使用が可能ですが、それ以外の句では問合せに別名を使用することはできません。

次の例は、SELECTリストのストリーム要素its.itemIdに対して別名badItemMATCH_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> 

詳細は、「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。