プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス
12c リリース(12.1.3)
E57533-04
目次へ移動
目次

前
前へ
次
次へ

2 Oracle CQLの基本要素

この章では、Oracle Continuous Query Language (Oracle CQL)の基本部分(データ型、リテラル、nullなど)のリファレンスを提供します。Oracle CQLは、Oracle Event Processingアプリケーションで使用される問合せ言語です。

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

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

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

data type

variable_length_datatype::=

variable length data type

fixed_length_datatype::=

fixed length data type

2.1.1 Oracle CQL組込みデータ型

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

イベント・タイプを定義するときは、これらのデータ型およびデータ型リテラルの制限を検討します。

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

Oracle CQLデータ型 説明

BIGINT

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

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

BOOLEAN

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

BYTE[(size)]

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

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

CHAR[(size)]

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

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

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

DOUBLE

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

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

FLOAT

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

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

INTEGER

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

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

INTERVAL

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

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

TIMESTAMP

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

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

XMLTYPE

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

XMLTYPEはシステム定義型であるため、関数の引数またはストリーム属性のデータ型として使用できます。これはjava.lang.String型に相当します。

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

OBJECT

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

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

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

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.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'を加算することはできません。ただし、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から

--

--

--

--

--

--

--

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 Event Processingで暗黙的なデータ型変換が行われる方向を決定します。

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

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

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

--

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プロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。その場合は、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_stringquoted_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

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に変換される文字列ではサポートされていません。たとえば、Oracle Event ProcessingINTEGERが所定の型である場合に文字列'9'が検出されると、文字列はJava Integer 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:dateTimexsd: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がサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲(SECONDMINUTE to SECONDなど)はサポートされていません。

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

pcbpel/cep/src/oracle/cep/common/Constants.BIGINT_LENGTH

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

書式モデル

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を使用してください。

Oracle Event Processingでは、長さゼロの文字値はそのままの状態で扱われます(SQLとは異なります)。ただし、数値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との関係で等号や不等号は成り立ちません。ただし、Oracle Event Processingでは、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リスト項目の別名を指定できます。

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

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

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>

詳細は、「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型を定義するには:

  1. プロセッサのコンポーネント構成ファイルを編集します。
  2. 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. aliases要素にtype-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. type-alias要素にsourceおよびtarget子要素を追加します。
    • sourceは別名を指定します。

      任意の有効なスキーマ名を使用できます。詳細は、「スキーマ・オブジェクト名と修飾子」を参照してください。

    • targetは、別名が参照するデータ型を指定します。

      Oracle CQLデータ・カートリッジの型の場合は、完全修飾型名を使用します。

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

    別名は、参照するデータ型とまったく同じように使用できます。次の例に示すように、別名を作成した型のメソッドおよびフィールドにアクセスできます。

    <?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.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ロケールの文字セットの英数字とアンダースコア(_)のみを使用できます。特に、スペース、ドット、スラッシュは使用できません。

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

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

    • ストリーム

    • 問合せ

    • ビュー

    • ユーザー定義関数

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

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

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

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

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

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

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

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

これらのすべての例は、「スキーマ・オブジェクトのネーミング・ルール」のルールに従っています。