ヘッダーをスキップ
Oracle® Complex Event Processing CQL言語リファレンス
11g リリース1(11.1.1.4.0)
B61613-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 Oracle CQLの基本要素

この章では、Oracle CQL文の最も単純な構成要素のリファレンス情報を提供します。

2.1 Oracle CQLの基本要素の概要

Oracle CQLには、次の基本要素があります。

第IV部「Oracle CQLの使用」に説明されている文を使用する前に、この章で説明する概念を理解しておく必要があります。

2.2 データ型

Oracle CEPで操作されるそれぞれの値にはデータ型があります。値のデータ型によって、固定のプロパティ・セットが値に関連付けられます。Oracle CEPではこれらのプロパティによって、あるデータ型の値が別のデータ型の値とは異なる方法で処理されます。たとえば、INTEGERデータ型の値は加算できますが、CHARデータ型の値は加算できません。ストリームを作成する場合は、各要素のデータ型を指定する必要があります。ユーザー定義関数を作成する場合は、各引数のデータ型を指定する必要があります。これらのデータ型は、各要素または各引数が保持できる値の範囲を定義します。たとえば、データ型がTIMESTAMPの属性は、February 29(うるう年を除く)や、2または'SHOE'などの値を受け入れることができません。Oracle CQLでは多数の組込みデータ型を使用できます。Oracle CQLデータ型の構文について、次の図に示します。

Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、Oracle CQLデータ・カートリッジまたはユーザー定義関数を作成してOracle CQL問合せでそのデータ型を評価できます。

詳細は、以下を参照してください。

datatype::=

datatype.pngについては周囲のテキストで説明しています。

variable_length_datatype::=

variable_length_datatype.pngについては周囲のテキストで説明しています。

fixed_length_datatype::=

fixed_length_datatype.pngについては周囲のテキストで説明しています。

2.2.1 Oracle CQL組込みデータ型

表2-1は、Oracle CQL組込みデータ型の概要を示しています。構文の要素については、前の項の構文を参照してください。

イベント・タイプを定義する場合は、これらのデータ型およびデータ型リテラルの制限を検討します。詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CEPのイベント・タイプの作成に関する項を参照してください。

表2-1 Oracle CQL組込みデータ型の概要

Oracle CQLデータ型 説明

BIGINT

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

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

BOOLEAN

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

BYTE[(size)]脚注1 

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

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

CHAR[(size)]脚注1

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

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

DOUBLE

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

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

FLOAT

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

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

INTEGER

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

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

INTERVAL

固定長のINTERVALデータ型は期間を指定します。Oracle CEPではDAY TO SECONDがサポートされます。最大長は64バイトです。

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

TIMESTAMP

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

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

XMLTYPE

このデータ型は、XMLデータを含むストリーム要素に使用します。最大長は4096文字です。

XMLTYPEはシステム定義型であるため、関数の引数またはストリーム属性のデータ型として使用できます。

詳細は、「SQL/XML (SQLX)」を参照してください。

OBJECT

任意のJavaオブジェクト(つまり、java.lang.Objectの任意のサブクラス)を指します。

Oracle CEPエンジンではOBJECTフィールドのコンテンツが認識されないため、これはOracle CEPの不透明な型のサポートと呼ばれます。

通常、この型はアダプタから送り先に値をそのまま渡す場合に使用します。Oracle CEPエンジンではこれらの値を解釈する必要はありませんが(Collection型または他の任意のユーザー固有のJava型)、関連付けられているイベントのその他のフィールドが問合せで参照されます。


脚注1Oracle CQLでは1次元配列のみがサポートされます。

2.2.2 Oracle CQLデータ・カートリッジを使用した他のデータ型の処理

Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、Oracle CQLデータ・カートリッジを作成してOracle CQL問合せでそのデータ型を評価できます。

Oracle CQLには、次のデータ・カートリッジが含まれます。

詳細は、14章「データ・カートリッジの概要」を参照してください。

2.2.3 ユーザー定義関数を使用した他のデータ型の処理

Oracle CQLでサポートされていないデータ型をイベントが使用している場合は、ユーザー定義関数を作成してOracle CQL問合せでそのデータ型を評価できます。

例2-1のようなenumデータ型があるとします。例2-2に示すイベントでは、このenumデータ型を使用しています。Oracle CQLではenumデータ型がサポートされていません。

例2-1 列挙データ型ProcessStatus

package com.oracle.app;

public enum ProcessStatus {
    OPEN(1), 
    CLOSED(0)}
}

例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章「ユーザー定義関数」を参照してください。

2.3 データ型の比較規則

この項では、Oracle CEPでの各データ型の値の比較方法について説明します。

2.3.1 数値

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

2.3.2 日付値

遅い日付は早い日付よりも大きいと見なされます。たとえば、'29-MAR-2005'と同等の日付は'05-JAN-2006'よりも小さい日付です。'05-JAN-2006 1:35pm''05-JAN-2005 10:09am'よりも大きい日付です。

2.3.3 文字値

Oracle CQLでは辞書順に基づいた辞書的ソートがサポートされています。

内部的には、Oracle CQLではcharの数値が比較されます。使用するエンコーディングに応じて数値は異なりますが、通常は、比較する際に違いはありません。例:

'a' < 'b'
'aa' < 'ab'
'aaaa' < 'aaaab'

2.3.4 データ型変換

通常、式では異なるデータ型の値を使用できません。たとえば、算術式で5 × 10の乗算の後に'JAMES'を加算することはできません。ただし、Oracle CEPではあるデータ型から別のデータ型への暗黙的および明示的な値の変換がサポートされています。

暗黙的または自動的な変換に依存するかわりに、Oracleでは明示的な変換の指定をお薦めします。これは、次の理由によります。

  • 明示的なデータ型変換関数を使用すると、Oracle CQL文が読みやすくなります。

  • 暗黙的なデータ型変換はパフォーマンスに悪影響を及ぼす可能性があります。

  • 暗黙的な変換は発生したコンテキストに依存し、すべてのケースで同じように動作しない可能性があります。

  • 暗黙的な変換のアルゴリズムはソフトウェア・リリース間やOracle製品間で変更される場合があります。明示的な変更では、動作がより安定しています。

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

2.3.4.1 暗黙的なデータ型変換

Oracle CEPでは、変換に意味がある場合に、あるデータ型から別のデータ型に値が自動的に変換されます。

表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

--

--

--

--

--

--

--

--


次の規則は、Oracle CEPで暗黙のデータ型変換が行われる方向を決定します。

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

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

  • FLOATからBIGINTへの変換は正確です。

  • BIGINT値が使用する精度のビット数がFLOATでサポートされる数を超えている場合、BIGINTからFLOATへの変換は正確ではありません。

  • 文字値とTIMESTAMP値を比較する場合、Oracle CEPでは文字データがTIMESTAMPに変換されます。

  • Oracle CQL関数または演算子で許可されていないデータ型の引数を使用すると、Oracle CEPではサポートされている場合は必ず、引数が使用可能なデータ型に変換されます。

  • 代入時、Oracle CEPでは等号(=)の右側の値が、左側の代入対象のデータ型に変換されます。

  • 連結操作時、Oracle CEPでは文字以外のデータ型がCHARに変換されます。

  • 文字データ型と文字以外のデータ型の間で算術演算または比較を行う場合、Oracle CEPでは数値型がCHARに変換されます(表2-2を参照)。

2.3.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.3.4.3 SQLデータ型変換

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

詳細は、以下を参照してください。

2.3.4.4 Oracleデータ・カートリッジのデータ型変換

実行時、Oracle CEPではデータ・カートリッジの実装に応じて、Oracle CQLとデータ・カートリッジのデータ型との間でマッピングが行われます。

詳細は、以下を参照してください。

2.3.4.5 ユーザー定義関数のデータ型変換

実行時、Oracle CEPではユーザー定義関数の戻り値の型に指定したOracle CQLデータ型とJavaの同等のデータ型との間でマッピングが行われます。

詳細は、13.1.2項「ユーザー定義関数のデータ型」を参照してください。

2.4 リテラル

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

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

2.4.1 テキスト・リテラル

このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracle CQL文の構文でconst_stringquoted_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ロケールで指定された文字セットのテキスト・リテラルを指定できます。

詳細は、以下を参照してください。

2.4.2 数値リテラル

固定長の数値または浮動小数点数値を指定する場合は、数値リテラルの表記を使用します。

2.4.2.1 整数リテラル

このリファレンスの他の部分で説明している式、条件、Oracle CQL関数、およびOracle CQL文でintegerと示されている箇所では常に整数表記を使用して整数を指定する必要があります。

integerの構文は次のとおりです。

integer::=

integer.pngについては周囲のテキストで説明しています。

digitは0、1、2、3、4、5、6、7、8、9のいずれかです。

整数は最大32桁の精度を格納できます。

次に、有効な整数を示します。

7
+255

2.4.2.2 浮動小数点リテラル

このリファレンスの他の部分で説明している式、条件、Oracle CQL関数およびOracleCQL文でnumberまたはnと示されている箇所では、常に数または浮動小数点数の表記を使用して値を指定する必要があります。

numberの構文は次のとおりです。

number::=

number.pngについては周囲のテキストで説明しています。

説明:

  • +は正、-は負の値を示します。符号を省略すると、デフォルトで正の値になります。

  • 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

2.4.3 日時リテラル

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:dateTimexsd: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)」を参照してください。

2.4.4 期間リテラル

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

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

2.4.4.1 INTERVAL DAY TO SECOND

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

interval_value::=

interval_value.pngについては周囲のテキストで説明しています。

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)です。

例2-9 期間の比較

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

2.5 書式モデル

書式モデルは、文字列に格納されている日時または数値データの形式を記述する文字リテラルです。文字列を日付または数値に変換する場合、Oracle CEPでの文字列の解釈のしかたは書式モデルによって決まります。Oracle CQL問合せに関連する次の書式モデルがあります。

2.5.1 数値書式モデル

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

  • to_bigint関数でintデータ型の値をbigintデータ型に変換します。

  • to_float関数でintまたはbigintデータ型の値をfloatデータ型に変換します。

2.5.2 日時書式モデル

Oracle CQLではjava.text.SimpleDateFormatが指定する書式モデルがサポートされています。

表2-4は、Oracle CQLがTIMESTAMPリテラルの解釈に使用するjava.text.SimpleDateFormatモデルを示しています。詳細は、2.4.3項「日時リテラル」を参照してください。

表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.6 Null

列の行に値がない場合、その列はnullである、またはnullを含んでいると言います。主キー整合性制約によって制限されていない任意のデータ型のタプルでは、nullが含まれている場合があります。実際の値が不明な場合や、値が意味を持たない場合はnullを使用します。

Oracle CEPでは、長さが0の文字値はnullとして処理されます。ただし、数値0を表す場合にはnullを使用しないでください。これらは等しくありません。


注意:

現在、Oracle CEPでは長さ0の文字値がnullとして処理されます。ただし、将来のリリースではこの処理が変更される場合があるため、空の文字列をnullと同じように処理しないことをお薦めします。

nullを含む算術式は常にnullに評価されます。たとえば、10にnullを加算したものはnullです。実際、nullオペランドを指定すると、すべての演算子ではnullが返されます(連結を除く)。

詳細は、以下を参照してください。

2.6.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.6.2 比較条件でのNull

nullをテストするには、null比較条件のみを使用します(null_conditions::=を参照)。それ以外の条件をnullで使用すると、結果がnull値に依存し、結果がUNKNOWNになります。nullはデータがないことを表すため、任意の値または別のnullと等しいか等しくないかを比較できません。ただし、Oracle CEPではdecode式の評価時に2つのnullが等価であると見なされます。構文と追加情報については、decode::=を参照してください。

2.6.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


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

2.7 コメント

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

2.8 別名

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

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

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

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

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

詳細は、第18章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。

2.8.1.1 relation_variable句の別名

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句」を参照してください。

2.8.1.2 ウィンドウ演算子の別名

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項「ストリームからリレーションへの演算子(ウィンドウ)」」を参照してください。

2.8.2 Aliases要素を使用した別名の定義

別名はロケーションの透過性を提供するために必要です。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で例外がスローされます。

  • 問合せまたはビュー定義が別名を参照している場合、別名はすでに存在する必要があります。

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

2.8.2.1 Aliases要素を使用してデータ型の別名を定義する方法

aliases要素の子要素type-aliasを使用して、データ型の別名を定義できます。任意の組込みまたはデータ・カートリッジ・データ型の別名を作成できます。

詳細は、2.2項「データ型」を参照してください。

aliases要素を使用してalias型を定義するには:

  1. プロセッサのコンポーネント構成ファイルを編集します。

  2. 例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>
    
  3. 例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>
    
  4. 例2-15に示すように、type-alias要素にsourceおよびtarget子要素を追加します。

    例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>
    
  5. 問合せおよびビューで、このプロセッサに定義した別名を使用します。

    別名は、参照するデータ型とまったく同じように使用できます。例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>
    

2.9 スキーマ・オブジェクト名と修飾子

一部のスキーマ・オブジェクトは、ストリームまたはビューのストリーム要素、整合性制約、ウィンドウ、ストリーム、ビューおよびユーザー定義の関数などの、ユーザーが指定できる部分または指定する必要のある部分で構成されています。この項の内容は、次のとおりです。

詳細は、1.2.1項「表記規則」を参照してください。

2.9.1 スキーマ・オブジェクトのネーミング・ルール

Oracle CEPの各オブジェクトには名前があります。Oracle CQL文では、引用符付きの識別子または引用符なしの識別子を使用してオブジェクト名を表します。

  • 引用符付きの識別子は、先頭と末尾に二重引用符(")を付けます。引用符付きの識別子を使用してスキーマ・オブジェクトを命名した場合は、そのオブジェクトを参照するときに必ず二重引用符を使用する必要があります。

  • 引用符なしの識別子は記号で囲みません。

Oracle CEPオブジェクトを命名する際は、引用符付きまたは引用符なしのどちらの識別子でも使用できます。

名前では大文字と小文字が区別されます。

特に記載のある場合を除いて、次の規則が引用符付きと引用符なしの両方の識別子に適用されます。

  • 名前の長さは1 - 30文字である必要があります。

    識別子がピリオドで区切られた複数の部分から成る場合、各属性は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"
    
  • 同一のストリームまたはビューのストリーム要素には同じ名前を使用できません。ただし、異なるストリームまたはビューのストリーム要素には同じ名前を使用できます。

  • 関数の引数の個数およびデータ型が異なる(つまり、シグネチャが固有である)場合は、関数に同じ名前を使用できます。引数の異なる同名の関数を複数作成することは、関数のオーバーロードと呼ばれます。

    組込み関数と同じ名前とシグネチャを持つユーザー定義関数を登録または作成すると、ユーザー関数が組込み関数のシグネチャに取ってかわります。組込み関数と同じ名前とシグネチャを持つ関数を作成することは、関数のオーバーライドと呼ばれます。

    組込み関数はパブリックですが、ユーザー定義関数は特定のスキーマに属しています。

    詳細は、以下を参照してください。

2.9.2 スキーマ・オブジェクトのネーミング・ガイドライン

次に、オブジェクトおよび各部分の命名に役立つガイドラインを示します。

  • 完全な、わかりやすい、発音可能な名前(またはよく知られた略語)を使用します。

  • 一貫性のあるネーミング・ルールを使用します。

  • ストリーム、ビュー、および問合せ間で同一のエンティティまたは属性を記述するには、同じ名前を使用します。

オブジェクトを命名する際は、短くて簡単に使用できる名前と可能なかぎり説明的な名前を付けることのバランスを取ります。迷った場合は、より説明的な名前のほうを選びます。これは、Oracle CEPのオブジェクトが多くの人々によって一定の期間使用される可能性があるためです。payment_due_dateのかわりにpmddなどのストリーム要素名を付けると、10年後のユーザーにとっては理解しづらいことが考えられます。

一貫性のあるネーミング・ルールを使用すると、アプリケーションでの各ストリームの役割が理解しやすくなります。このようなルールとして、FINANCEアプリケーションに属するすべてのストリーム名をfin_で開始するなどがあります。

ストリーム間で同一の項目を記述するには、同じ名前を使用します。たとえば、employeesおよびdepartmentsストリームでは、どちらも部門番号のストリーム要素にdepartment_idという名前を付けます。

2.9.3 スキーマ・オブジェクトのネーミング例

次に、有効なスキーマ・オブジェクト名の例を示します。

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