ヘッダーをスキップ
Oracle® CEP CQL 言語リファレンス
11g リリース 1 (11.1.1)
B55504-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2 Oracle CQL の基本要素

この章には、Oracle CQL 文の最も単純な構成要素のリファレンス情報が含まれています。

2.1 Oracle CQL の基本要素の概要

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

第 14 章第 16 章に記載された文を使用する前に、この章で説明している概念を理解しておく必要があります。

2.2 データ型

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

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

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

datatype::=

datatype.gif を説明する関連テキスト

variable_length_datatype::=

variable_length_datatype.gif を説明する関連テキスト

fixed_length_datatype::=

fixed_length_datatype.gif を説明する関連テキスト

2.2.1 Oracle CQL 組み込みデータ型

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

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

Oracle CQL データ型 説明

BIGINT

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

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

BOOLEAN

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

BYTE[(size)]

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

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

CHAR [(size)]

長さが 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 型)、関連付けられているイベントのその他のフィールドがクエリで参照されます。


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

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

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>

詳細については、第 10 章「関数 : ユーザ定義」を参照してください。

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


--

--

--

--

--

--

--

--

BIGINT から

TO_CHAR


--

TO_BOOLEAN


--

TO_DOUBLE


--

TO_FLOAT


--

--

FLOAT から

TO_CHAR


--

--

--

TO_DOUBLE


--

--

--

--

TIMESTAMP から

TO_CHAR


--

--

--

--

--

--

--

--

INTERVAL から

TO_CHAR


--

--

--

--

--

--

--

--


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

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

詳細については、節 10.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.gif を説明する関連テキスト

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

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

以下は、有効な整数です。

7
+255

2.4.2.2 浮動小数点数リテラル

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

number の構文は以下のとおりです。

number::=

number.gif を説明する関連テキスト

各項目は次のとおりです。

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

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

Oracle では、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.gif を説明する関連テキスト

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 が含まれている場合があります (out_of_line_constraint::= を参照)。実際の値が不明な場合や、値が意味を持たない場合は null を使用します。

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


注意 :

現在、Oracle CEP では長さ 0 の文字値が null として処理されます。ただし、将来のリリースではこの処理が変更される場合があるため、Oracle では空の文字列を 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 が無視されます。たとえば、1000、null、null、null、および 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


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

2.7 コメント

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

2.8 エリアス

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

この節では、以下について説明します。

詳細については、第 14 章「Oracle CQL のクエリ、ビュー、および結合」を参照してください。

2.8.1 relation_variable 句のエリアス

relation_variable 句の AS 演算子でエリアスを定義して select リストの直前の式にラベルを付け、その名前で結果を参照できます。エリアスによって、クエリの期間中に select リストの項目名が効率的に変更されます。エリアスは、ORDER BY 句 (節 14.2.6「クエリ結果のソート」を参照) で使用できますが、クエリの他の句では使用できません。

例 2-10 は、SELECT リストのストリーム要素 its.itemId のエリアス badItem と、MATCH_RECOGNIZE 句のエリアス its を定義する方法を示しています。

例 2-10 SELECT 文での AS 演算子の使用

<query id="detectPerish"><![CDATA[ 
  select its.itemId
  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>

詳細については、節 14.2.1.3「From 句」を参照してください。

2.8.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.9 スキーマ オブジェクト名と修飾子

一部のスキーマ オブジェクトは、ストリームまたはビューのストリーム要素、整合性制約、枠、ストリーム、ビュー、およびユーザ定義の関数や枠などの、ユーザが指定できる部分または指定する必要のある部分で構成されています。この節には、以下の説明が含まれています。

詳細については、節 1.2.1「Oracle CQL 文の表記規則」を参照してください。

2.9.1 スキーマ オブジェクトの命名規則

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

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

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

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

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

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

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

    識別子がピリオドで区切られた複数の部分から成る場合、各属性は 30 バイトまでの長さで指定できます。各ピリオド区切り文字と外側の二重引用符は 1 バイトとしてカウントされます。たとえば、次のようなストリーム要素を識別するとします。

    "stream"."attribute"
    

    ストリーム名と要素名は 30 バイトの長さにできます。引用符記号とピリオドはそれぞれ 1 バイト文字であるため、この例の識別子の合計の長さは 65 バイトまで許可されます。

  2. 引用符なしの識別子は Oracle CEP 予約語にできません。引用符付きの識別子は予約語にできますが、これは推奨されません。

    Oracle CEP オブジェクトへのアクセスに使用する Oracle 製品によっては、製品固有の予約語により名前がさらに制限される可能性があります。

    Oracle CQL 言語には特殊な意味を持つ他の語が含まれています。これらの語は予約語ではありません。しかし、これらは内部的に特殊な方法で使用されます。このため、これらの語をオブジェクトやオブジェクトの各部分の名前として使用すると、Oracle CQL 文が読みにくくなり、予期しない結果が生じることがあります。

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

  3. 異なるプラットフォームまたはオペレーティング システム間で最適な互換性が提供されるため、Oracle ではスキーマ オブジェクト名に ASCII 文字を使用することをお勧めします。

  4. 引用符なしの識別子は、データベース文字セットのアルファベット文字で開始する必要があります。引用符付きの識別子は任意の文字で開始できます。

  5. 引用符なしの識別子には Java ロケールの文字セットの英数字、アンダースコア (_)、ドル記号 ($)、およびシャープ記号 (#) のみを使用できます。Oracle では、引用符なしの識別子に $ および # を使用しないことを強くお勧めします。

    引用符付きの識別子には任意の文字、記号、およびスペースを使用できます。ただし、二重引用符または null 文字 (\0) は、引用符付きまたは引用符なしのどちらの識別子にも使用できません。

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

  6. 通常、以下のオブジェクトでは、アプリケーションで一意の名前を選択する必要があります。

    • ストリーム

    • クエリ

    • ビュー

    • ユーザ定義関数

    • ユーザ定義枠

    特に、クエリとビューに同じ名前を付けることはできません。

  7. 引用符なしの識別子では大文字と小文字が区別されません。Oracle CEP ではそれらが大文字として解釈されます。引用符付きの識別子では大文字と小文字が区別されます。

    二重引用符で名前を囲むことによって、以下の名前を同じ名前空間の異なるオブジェクトに割り当てることができます。

    employees
    "employees"
    "Employees"
    "EMPLOYEES"
    

    Oracle CEP では以下の名前が同等に解釈されるため、同じ名前空間の異なるオブジェクトにはこれらの名前を使用できません。

    employees
    EMPLOYEES
    "EMPLOYEES"
    
  8. 同一のストリームまたはビューのストリーム要素には同じ名前を使用できません。ただし、異なるストリームまたはビューのストリーム要素には同じ名前を使用できます。

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

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

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

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

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