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

戻る
戻る
 
次へ
次へ
 

1 Oracle CQL の概要

Oracle Continuous Query Language (Oracle CQL) は、データのストリーミングをサポートする構成体が追加された SQL に基づくクエリ言語です。Oracle CQL を使用すると、Oracle CEP を使用して複合イベント処理 (CEP) を行う、データ ストリームに対するクエリを表現できます。

Oracle CEP (以前の WebLogic Event Server) は、高性能なイベント駆動型アプリケーション開発用の Java サーバです。これは、Equinox OSGi に基づいた軽量な Java アプリケーション コンテナであり、ビジネス業務管理の効率性と有効性を向上するため、機能豊富な宣言の環境を提供する Oracle CEP サービス エンジンなどの共有サービスを使用します。このサービスは、Oracle CQL を基盤としています。Oracle CEP では、JRockit Real Time を使用して非常に高度なスループットとマイクロ秒のレイテンシがサポートされ、完全にリアルタイムなエンドツーエンドの Java イベント駆動アーキテクチャ (EDA) 開発プラットフォーム用の Oracle CEP Visualizer および Oracle CEP IDE for Eclipse 開発ツールが用意されています。

1.1 Oracle CQL の基本

格納されている有限なデータ セットに対してクエリを実行する場合には、データベースが最適です。しかし、多くの最新のアプリケーションでは、連続する無限のデータ セットに対する長時間のクエリ実行が要求されます。設計上、格納されたデータ セットは大量のデータに対して反復的にクエリを実行したり、あまり頻繁に更新を行わない場合に適しています。これに対して、データ ストリームは絶えず変化するデータを表します。多くの場合は、新しい要素の挿入のみが行われます。大量のデータの反復的な操作は不要であると同時に非実用的です。

センサー データ アプリケーション、財務表示、ネットワーク性能測定ツール、ネットワーク監視およびトラフィック管理アプリケーション、クリックストリーム分析ツールなどの多くの種類のアプリケーションでは、データ セットの代わりにデータ ストリームが生成されます。これらの種類のアプリケーション データを管理および処理する際は、厳密な時間によるフォーカスを使用して、データ管理およびクエリ機能を作成します。

こうした要件に応えるために、構造化データ レコードのストリームと格納されたリレーションの概念をサポートするデータ管理インフラストラクチャの Oracle CEP が導入されました。

統一的な宣言フレームワークを提供するために、データのストリーミングをサポートする構成体が追加された SQL に基づくクエリ言語の Oracle Continuous Query Language (Oracle CQL) が提供されています。

Oracle CQL は以下の理念に基づいて設計されています。

図 1-1 に、Oracle CEP アーキテクチャを簡単に示します。Oracle CEP サーバでは Oracle CEP アプリケーション用の軽量な Spring コンテナが提供されます。この Oracle CEP アプリケーションは、入力チャネルにイベント データを提供するイベント アダプタで構成されています。入力チャネルは、入力チャネルから提供されたイベントを操作する 1 つ以上の Oracle CQL クエリに関連付けられた、Oracle CQL プロセッサに接続されています。Oracle CQL プロセッサは、クエリ結果が書き込まれる出力チャネルに接続されています。出力チャネルはイベント Bean に接続されています。これは、出力チャネルから受け取ったイベントに基づいてアクションを実行するユーザ作成の Plain Old Java Object (POJO) です。

図 1-1 Oracle CEP アーキテクチャ

図 1-1 の説明
「図 1-1 Oracle CEP アーキテクチャ」の説明

Oracle CEP を使用すると、JMS、リレーショナル データベース テーブル、ローカル ファイルシステムのファイルなどの各種データ ソースに対するイベント アダプタを定義できます。複数の入力チャネルを Oracle CQL プロセッサに接続したり、Oracle CQL プロセッサを複数の出力チャネルに接続できます。出力チャネルを別の Oracle CQL プロセッサ、アダプタ、キャッシュ、またはイベント Bean に接続できます。

Oracle CEP IDE for Eclipse と Oracle CEP Visualizer を使用して、以下のことを行います。

例 1-1 に示すような、通常の Oracle CQL 文があるとします。

例 1-1 通常の Oracle CQL 文

<?xml version="1.0" encoding="UTF-8"?>
<n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd" 
xmlns:n1="http://www.bea.com/ns/wlevs/config/application" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
    <name>cqlProcessor</name>
    <rules>
        <view id="lastEvents" schema="cusip bid srcId bidQty ask askQty seq"><![CDATA[ 
            select cusip, bid, srcId, bidQty, ask, askQty, seq 
            from inputChannel[partition by srcId, cusip rows 1]
        ]]></view>
        <view id="bidask" schema="cusip bid ask"><![CDATA[ 
            select cusip, max(bid), min(ask) 
            from lastEvents
            group by cusip
        ]]></view>
            <view ...><![CDATA[
                ...
        ]]></view>
        ...
        <view id="MAXBIDMINASK" schema="cusip bidseq bidSrcId bid askseq askSrcId ask bidQty askQty"><![CDATA[ 
            select bid.cusip, bid.seq, bid.srcId as bidSrcId, bid.bid, ask.seq, ask.srcId as askSrcId, ask.ask, bid.bidQty, ask.askQty             from BIDMAX as bid, ASKMIN as ask 
            where bid.cusip = ask.cusip
        ]]></view>
        <query id="BBAQuery"><![CDATA[ 
            ISTREAM(select bba.cusip, bba.bidseq, bba.bidSrcId, bba.bid, bba.askseq, bba.askSrcId, bba.ask, bba.bidQty, bba.askQty, "BBAStrategy" as intermediateStrategy, p.seq as correlationId, 1 as priority 
            from MAXBIDMINASK as bba, inputChannel[rows 1] as p where bba.cusip = p.cusip)
        ]]></query>
    </rules>
</processor>

この例では、複数のリレーションを作成するために複数のビュー (Oracle CQL でのサブクエリ) が定義され、各ビューは前のビューに基づいています。ビューは常に inputChannel などの着信チャネルに対して機能します。lastEvents という最初のビューは inputChannel から直接選択します。後続のビューは inputChannel から直接選択するか、前に定義されたビューから選択します。ビューの選択文で返された結果はビューのリレーションに残ったまま維持され、出力チャネルには転送されません。これはクエリの動作です。この例では、inputChannel からの直接の選択と、前に定義されたビューからの選択の両方を行うクエリ BBAQuery が定義されます。クエリの選択句から返された結果は、関連付けられた出力チャネルに転送されます (この例では outputChannel)。BBAQuery は、タプルベースのストリームからリレーションへの演算子 (またはスライド枠) を使用します。

これらの要素の詳細については、以下を参照してください。

Oracle CEP サーバと各ツールの詳細については、以下を参照してください。

1.1.1 ストリームとリレーション

この節では、Oracle CQL を使用して操作する 2 つの基本的な Oracle CEP オブジェクトについて説明します。

Oracle CQL を使用して、ストリームとリレーションの以下の操作を実行できます。

1.1.1.1 ストリーム

ストリームは、Oracle CQL クエリでの操作の対象となる主なデータ ソースです。

ストリーム S は複数の要素セット (s,T) のバッグです。sS のスキーマを持ち、T は時間に属します。

ストリーム要素はタプルとタイムスタンプのペアであり、タイムスタンプを持つタプルの挿入シーケンスとして表すことができます。言い換えると、ストリームとはタイムスタンプを持つタプルのシーケンスです。同じタイムスタンプを持つ複数のタプルがある場合があります。入力ストリームのタプルは、タイムスタンプが増加する順にシステムに到着する必要があります。詳細については、節 1.1.10「時間」を参照してください。

ストリームには名前付き属性のセットで構成される関連付けられたスキーマがあり、ストリームのすべてのタプルはスキーマに準拠しています。

「ストリームのタプル」という用語はストリーム要素のデータ部分 (タイムスタンプ データは除く) の順序付きリストを表します (<s,t>s)。例 1-2 に、株価表示データ ストリームがどのように表されるかを示します。各ストリーム要素は <timestamp value><stock symbol>、および <stock price> で構成されます。

例 1-2 株価表示データ ストリーム

...
<timestampN>    NVDA,4
<timestampN+1>  ORCL,62
<timestampN+2>  PCAR,38
<timestampN+3>  SPOT,53
<timestampN+4>  PDCO,44
<timestampN+5>  PTEN,50
...

ストリーム要素 <timestampN+1>  ORCL,62 のタプルは ORCL,62 です。

定義により、ストリームは無限です。

Oracle CEP ではストリームはチャネルとして表されます (図 1-2 を参照)。Oracle CEP IDE for Eclipse を使用して、ストリーム イベント ソース (PriceAdapter) をチャネル (priceStream) に接続し、チャネルを Oracle CQL プロセッサ (filterFanoutProcessor) に接続して、プロセッサにイベントを提供します。Oracle CQL プロセッサをチャネル (filteredStream) に接続し、Oracle CQL クエリ結果を下流コンポーネント (図 1-2 には表示されていません) に出力します。

図 1-2 イベント処理ネットワーク内のストリーム

図 1-2 の説明
「図 1-2 イベント処理ネットワーク内のストリーム」の説明


注意 :

Oracle CEP では、チャネルを使用してイベント ソースを Oracle CQL プロセッサに接続し、Oracle CQL プロセッサをイベント シンクに接続する必要があります。他の Oracle CEP プロセッサ タイプでは、チャネルはオプションです。

ストリームに接続するイベント ソースによってストリームのスキーマが決定されます。図 1-2 では、PriceAdapter アダプタによって priceStream ストリームのスキーマが決定されます。例 1-3PriceAdapter アセンブリ ソースを示します。eventTypeName プロパティはイベント タイプ PriceEvent を指定します。event-type-repository はこのイベントのプロパティ名とタイプを定義します。

例 1-3 ストリームのスキーマ定義

<wlevs:event-type-repository>
    <wlevs:event-type type-name="PriceEvent">
        <wlevs:properties>
            <wlevs:property name="cusip" type="java.lang.String" />
            <wlevs:property name="bid" type="java.lang.Double" />
            <wlevs:property name="srcId" type="java.lang.String" />
            <wlevs:property name="bidQty" type="java.lang.Integer" />
            <wlevs:property name="ask" type="java.lang.Double" />
            <wlevs:property name="askQty" type="java.lang.Integer" />
            <wlevs:property name="seq" type="java.lang.Long" />
            <wlevs:property name="sector" type="java.lang.String" />
        </wlevs:properties>
    </wlevs:event-type>
</wlevs:event-type-repository>

<wlevs:adapter advertise="true" id="PriceAdapter"
<wlevs:instance-property name="port" value="9008" />
    <wlevs:instance-property name="eventTypeName"
        value="PriceEvent" />
    <wlevs:instance-property name="eventPropertyNames"
        value="srcId,sector,cusip,bid,ask,bidQty,askQty,seq" />
</wlevs:adapter>

図 1-2 に示すようにイベント ソース、チャネル、およびプロセッサが接続されると、ストリームを使用する Oracle CQL 文を作成できます (例 1-4 を参照)。

例 1-4 priceStream を使用する filterFanoutProcessor Oracle CQL クエリ

<processor>
    <name>filterFanoutProcessor</name>
    <rules>
        <query id="Yr3Sector"><![CDATA[ 
            select cusip, bid, srcId, bidQty, ask, askQty, seq 
            from priceStream where sector="3_YEAR"
        ]]></query>
        <query id="Yr2Sector"><![CDATA[ 
            select cusip, bid, srcId, bidQty, ask, askQty, seq 
            from priceStream where sector="2_YEAR"
        ]]></query>
        <query id="Yr1Sector"><![CDATA[ 
            select cusip, bid, srcId, bidQty, ask, askQty, seq 
            from priceStream where sector="1_YEAR"
        ]]></query>
    </rules>
</processor>

例 1-4 に示すようにプロセッサの複数のクエリを指定した場合は、すべてのクエリ結果がプロセッサの発信チャネルに出力されます (図 1-2filteredStream)。必要に応じて、コンポーネント コンフィグレーション ソースで channel 要素の selector 属性を使用して、出力されるクエリ結果を制御できます (例 1-5 を参照)。この例では、クエリ Yr3Sector および Yr2Sector のクエリ結果は filteredStream に出力されますが、クエリ Yr1Sector のクエリ結果は出力されません。詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』の「チャネル コンポーネント コンフィグレーション」を参照してください。

例 1-5 selector を使用したクエリ結果出力の制御

<channel>
    <name>filteredStream</name>
    <selector>Yr3Sector Yr2Sector</selector>
</channel>

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

1.1.1.2 リレーション

時間で変化するリレーション R は、時間ドメインから R のスキーマを持つ無制限のタプルのバッグへのマッピングです。

リレーションとは、並べ替えられていない、時間で変化するタプルのバッグです。言い換えると、瞬間的なリレーションです。各瞬間において、リレーションは制限されたセットです。また、リレーションの変化する状態を表す挿入、削除、または更新を含む、タイムスタンプを持つタプルのシーケンスとして表すこともできます。

ストリームと同様、リレーションにはすべてのタプルが準拠する固定スキーマがあります。

Oracle CEP では基本および派生ストリームとリレーションがサポートされています。外部ソースは基本のストリームとリレーションにデータを提供します。

基本 (明示的な) ストリームは Oracle CEP アダプタに到着するソース データ ストリームであるため、時間は非減少です。つまり、各イベントが同一の時間の値を持つ場合があります。

派生した (暗黙的な) ストリーム/リレーションは、クエリ演算子で生成される中間のストリーム/リレーションです。これらの中間の演算子は (ビューを通じて) 指定できるため、以降のクエリで指定できます。

基本リレーションは入力リレーションです。

派生したリレーションは、クエリ演算子で生成される中間のリレーションです。これらの中間の演算子は (ビューを通じて) 指定できるため、以降のクエリで指定できます。

Oracle CEP では、ユーザ自身は基本リレーションを作成しません。基本リレーションは Oracle CEP サーバで必要に応じて作成されます。

リレーションが時間で変化するタプルのバッグであると言う場合、時間は時間ドメインの瞬間を指します。入力リレーションは、時間の経過に沿ったリレーションの変化を表す、タイムスタンプを持つ更新のシーケンスとしてシステムに提示されます。更新はタプルの挿入または削除のいずれかです。更新はタイムスタンプが増加する順にシステムに到着する必要があります。詳細については、節 1.1.10「時間」を参照してください。

1.1.1.3 リレーションと Oracle CEP Tuple Kind インジケータ

デフォルトでは、Oracle CEP で生成されるリレーションにはタイムスタンプと Oracle CEP Tuple Kind インジケータが含まれています (例 1-6 を参照)。

例 1-6 リレーション出力の Oracle CEP Tuple Kind インジケータ

Timestamp   Tuple Kind  Tuple
 1000:      +           ,abc,abc
 2000:      +           hihi,abchi,hiabc
 6000:      -           ,abc,abc
 7000:      -           hihi,abchi,hiabc
 8000:      +           hi1hi1,abchi1,hi1abc
 9000:      +           ,abc,abc
13000:      -           hi1hi1,abchi1,hi1abc
14000:      -           ,abc,abc
15000:      +           xyzxyz,abcxyz,xyzabc
20000:      -           xyzxyz,abcxyz,xyzabc

Oracle CEP Tuple Kind インジケータは以下のとおりです。

  • 挿入タプルの場合は +

  • 削除タプルの場合は -

  • onUpdateEventcom.bea.wlevs.ede.api.RealtionSink メソッドの呼び出しで示される更新タプルの場合は U (詳細については、『Oracle CEP Java API Reference』を参照してください)。

サイレント操作をコンフィグレーションするには、『Oracle CEP IDE Eclipse 開発者ガイド』の「wlevs:channel」で属性 is-silent-relation に関する説明を参照してください。

このマニュアルでは、リレーションは常に非サイレントとして示されています。つまり、タイムスタンプと Oracle CEP Tuple Kind インジケータが常に表示されます (例 1-6 を参照)。

1.1.2 リレーションからリレーションへの演算子

Oracle CQL のリレーションからリレーションへの演算子は、SQL で表される従来のリレーショナル クエリから派生しています。

SQL クエリで従来のリレーションが参照される任意の場所では、Oracle CQL でリレーションを参照できます。

次のような、スキーマ car_id integerspeed integerexp_way integerlane integerdir integer、および seg integer を持つストリーム CarSegStr の例があるとします。

例 1-7 では、任意の時点で、このクエリの出力リレーションに直前の 30 秒間に位置-速度の測定を送信した自動車のセットが含まれます。

例 1-7 リレーションからリレーションへの演算

<processor>
    <name>cqlProcessor</name>
    <rules>
        <view id="CurCarSeg" schema="car_id exp_way lane dir seg"><![CDATA[ 
            select distinct
                car_id, exp_way, lane, dir, seg 
            from 
                CarSegStr [range 30 seconds]
        ]]></query>
    </rules>
</processor>

distinct 演算子はリレーションからリレーションへの演算子です。distinct を使用すると、Oracle CEP では選択された重複するタプル セットの 1 つのコピーのみが返されます。重複タプルとは select リスト内の各式と一致する値を持つタプルです。distinct は select_clause と集約関数で使用できます。

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

1.1.3 ストリームからリレーションへの演算子 (枠)

Oracle CQL では、スライド枠に基づいた、ストリームからリレーションへの演算がサポートされています。通常、S[W] はリレーションです。時間 T のリレーションには、T までにストリーム S に適用された枠 W のすべてのタプルが含まれます。

window_type::=

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

Oracle CQL では、以下の種類の組み込み枠がサポートされています。

  • 範囲 : 時間ベース

    S[Range T] またはオプションで、

    S[Range T1 Slide T2]

  • 範囲 : 時間ベース (無限)

    S[Range Unbounded]

  • 範囲 : 時間ベース (現在)

    S[Now]

  • 範囲 : 定数値

    S[Range C on ID]

  • タプルベース :

    S[Rows N] またはオプションで、

    S[Rows N1 Slide N2]

  • 分割 :

    S[Partition By A1 ... Ak Rows N] またはオプションで、

    S[Partition By A1 ... Ak Rows N Range T] または

    S[Partition By A1 ... Ak Rows N Range T1 Slide T2]

キーワード Range および Rows はクエリで操作するデータの量を指定します。Range では指定の期間内に到着する量のタプルが指定されます。Rows ではタプルの数が指定されます。キーワード Slide は必要とする結果の間隔を表します。図 1-3 で、Range の指定は「5 秒間に相当するデータを参照する必要がある」ことを示し、Slide の指定は「5 秒ごとの結果が必要である」ことを示します。

図 1-3 Range と Slide

図 1-3 の説明
「図 1-3 Range と Slide」の説明

キーワード Partition By では、Partition By で指定された属性の同一性に基づいて、データ ストリーム S が異なるサブストリームに論理的に分割されます。たとえば、S[Partition By A,C Rows 2] のように分割を指定すると、AC の値のペアの固有な組み合わせごとにサブストリームが作成され、それらのサブストリームに対して Rows の指定が適用されます。Rows の指定は、「2 タプルに相当するデータを参照する必要がある」ことを示します。デフォルトでは、範囲 (およびスライド) は 1 秒です。

独自のユーザ定義のカスタム枠を作成することもできます。

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

1.1.4 リレーションからストリームへの演算子

ストリームからリレーションへの演算結果を、さらに処理を行うためストリームに戻すことができます。

例 1-8 では、select によってフィルタ条件 (viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID) を満たすタプルのストリームが出力されます。now 枠によって viewq3 がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへの IStream 演算子によって、フィルタ出力がストリームに変換されます。

例 1-8 リレーションからストリームへの演算

<processor>
    <name>cqlProcessor</name>
    <rules>
        <query id="q3Txns"><![CDATA[ 
            IStream(
                select 
                    TxnId, 
                    ValidLoopCashForeignTxn.ACCT_INTRL_ID, 
                    TRXN_BASE_AM, 
                    ADDR_CNTRY_CD, 
                    TRXN_LOC_ADDR_SEQ_ID 
                from 
                    viewq3[NOW], ValidLoopCashForeignTxn 
                where 
                    viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID
            )
        ]]></query>
    </rules>
</processor>

Oracle CQL では、リレーションからストリームへの以下の演算子がサポートされています。

デフォルトでは、Oracle CEP で生成されるリレーションには操作指示子が含まれるため、挿入、削除、および更新 (UPDATE SEMANTICS を使用している場合) を識別できます。詳細については、節 1.1.1.3「リレーションと Oracle CEP Tuple Kind インジケータ」を参照してください。

1.1.5 ストリームからストリームへの演算子

ストリームからストリームへの演算に特定の演算子はありません。その代わり、以下を使用してストリームからストリームへの演算を実行します。

ただし、リレーションからリレーションへの一部の演算子 (filter や project など) はストリームからストリームへの演算子としても機能します。例 1-9 に示すクエリがあるとします。入力 S はストリームであると想定され、このクエリではストリーム要素 c1 が 50 を超える場合にストリームが出力として生成されます。

例 1-9 ストリームからストリームへの演算

<processor>
    <name>cqlProcessor</name>
    <rules>
        <query id="q0"><![CDATA[ 
            select * from S where c1 > 50
        ]]></query>
    </rules>
</processor>

また、Oracle CQL では以下の直接的なストリームからストリームへの演算子がサポートされています。

  • MATCH_RECOGNIZE : この句を使用して、入力ストリームの各種のパターン認識クエリを作成します。詳細については、節 1.1.7「パターン認識」を参照してください。

  • XMLTABLE : この句を使用して、XPath 式を使用して xmltype ストリーム要素のデータを解析します。詳細については、節 14.2.5「XMLTable のクエリ」を参照してください。

1.1.6 クエリ、ビュー、および結合

Oracle CQL クエリは、Oracle CQL 構文で表され、1 つ以上のストリーム、リレーション、またはビューからのデータを取得するために Oracle CEP CQL プロセッサで実行される操作です。[REGISTER|CREATE] QUERY 文を使用して作成した最上位の SELECT 文はクエリと呼ばれます。詳細については、節 14.2「クエリ」を参照してください。

Oracle CQL ビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQL では、サブクエリの代わりにビューを使用します。[REGISTER|CREATE] VIEW 文を使用して作成した VIEW 文はビューと呼ばれます。詳細については、節 14.3「ビュー」を参照してください。

結合は、複数のストリーム、ビュー、またはリレーションから行を結合するクエリです。詳細については、節 14.4「結合」を参照してください。

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

1.1.7 パターン認識

Oracle CQL MATCH_RECOGNIZE 構成体は、パターン認識を実行するための主な手段です。

入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQL のパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれる String 名を使用してこれらの条件を識別できます。照合されるパターンは、これらの相関変数に対する正規表現として指定され、さまざまな着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序が決定されます。

詳細については、第 15 章「MATCH_RECOGNIZE を使用したパターン認識」を参照してください。

1.1.8 イベント ソースとイベント シンク

Oracle CEP イベント ソースは Oracle CQL クエリが操作するデータのプロデューサを識別します。Oracle CQL イベント シンクはクエリ結果のコンシューマを識別します。

この節では、Oracle CQL クエリでアクセスできるイベント ソースとイベント シンクの種類について説明します。

1.1.8.1 イベント ソース

Oracle CEP イベント ソースは Oracle CQL クエリが操作するデータのプロデューサを識別します。

Oracle CEP では、イベント ソースとして以下の要素を使用できます。

  • アダプタ (JMS、HTTP、およびファイル)

  • チャネル

  • プロセッサ

  • キャッシュ

  • リレーショナル データベース テーブル


注意 :

Oracle CEP では、チャネルを使用してイベント ソースを Oracle CQL プロセッサに接続し、Oracle CQL プロセッサをイベント シンクに接続する必要があります。他の Oracle CEP プロセッサ タイプでは、チャネルはオプションです。詳細については、節 1.1.1「ストリームとリレーション」を参照してください。

Oracle CEP イベント ソースは、通常はプッシュ データ ソースです。つまり、Oracle CEP ではデータの準備ができたイベント ソースからの通知を予期します。

Oracle CEP の table および cache イベント ソースはプル データ ソースです。つまり、Oracle CEP はイベント ソースを定期的にポーリングします。

Oracle CQL プロセッサを使用すると、リレーショナル データベース テーブルをイベント ソースとして指定できます。このイベント ソースでクエリを実行したり、他のイベント ソースと結合したりできます。詳細については、以下を参照してください。

Oracle CQL プロセッサを使用すると、キャッシュをイベント ソースとして指定できます。Now 枠を使用する場合にのみ、このイベント ソースでクエリを実行したり、他のイベント ソースと結合できます。詳細については、以下を参照してください。

1.1.8.2 イベント シンク

CQL プロセッサに接続されている Oracle CQL イベント シンクはクエリ結果のコンシューマです。

Oracle CEP では、イベント シンクとして以下の要素を使用できます。

  • アダプタ (JMS、HTTP、およびファイル)

  • チャネル

  • プロセッサ

  • キャッシュ

同一のクエリを複数のイベント シンクや、異なる種類のイベント シンクに関連付けることができます。

Oracle CEP では、Oracle CEP IDE for Eclipse を使用してイベント処理ネットワーク (EPN) を作成し、イベント ソースとイベント シンクを定義します (図 1-4 を参照)。この EPN で、アダプタ PriceAdapter はチャネル priceStream のイベント ソースであり、チャネル priceStream は Oracle CQL プロセッサ filterFanoutProcessor のイベント ソースです。同様に、Oracle CQL プロセッサ filterFanoutProcessor はチャネル priceStream のイベント シンクです。

図 1-4 イベント処理ネットワークのイベント ソースとイベント シンク

図 1-4 の説明
「図 1-4 イベント処理ネットワークのイベント ソースとイベント シンク」の説明

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

1.1.9 関数

関数は、データ項目を操作して結果を返す点で演算子と同様です。関数が演算子と異なる点は、引数の形式です。この形式により、0、1、2 個、またはより多数の引数を操作できます。

function(argument, argument, ...) 

引数を持たない関数は擬似列と同じです (第 3 章「擬似列」を参照)。ただし、擬似列ではリレーションの各タプルで異なる値が返されますが、引数を持たない関数では各タプルに対して通常は同じ値が返されます。

Oracle CQL には、ストリーム データの操作を実行する、以下のような広範な組み込み関数が用意されています。

  • クエリのストリームまたはビューの各行ごとに単一の結果行を返す単一行関数

  • 単一のタプルの代わりにタプルのグループに基づいて単一の集約結果を返す集約関数

  • Colt オープン ソース ライブラリに基づいた、高性能な科学技術計算のための単一行の統計的かつ高度な算術演算

  • Colt オープン ソース ライブラリに基づいた、高性能な科学技術計算のための集約の統計的かつ高度な算術演算

  • java.lang.Math クラスに基づいた統計的かつ高度な算術演算

アプリケーションで必要な機能が Oracle CQL 組み込み関数に用意されていない場合は、oracle.cep.extensibility.functions パッケージのクラスを使用して、ユーザ定義関数を Java で簡単に作成できます。ユーザ定義の集約関数および単一行関数を作成できます。オーバーロード関数の作成、および組み込み関数の上書きができます。

Oracle CQL 関数で予期される型以外のデータ型の引数を使用して Oracle CQL 関数を呼び出した場合、Oracle CEP では Oracle CQL 関数を実行する前に、予期されるデータ型に引数を変換しようと試みます。

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

1.1.10 時間

タイムスタンプは Oracle CEP ストリームの重要な部分です。ただし、タイプスタンプは必ずしもクロック タイムと同じである必要はありません。たとえば、アプリケーション ドメインで時間を定義し、シーケンス番号で表すことができます。タイムスタンプは、タイムスタンプの値が増加する順に更新がシステムに到着することだけを保証するよう要求されます。

タイムスタンプの順序の要件は、1 つのストリームまたはリレーションに固有のものです。たとえば、異なるストリームのタプルは任意の順序で相互配置できます。

Oracle CEP ではアプリケーション時間またはシステム時間を監視できます。

アプリケーション タイムスタンプまたはシステム タイムスタンプの操作をコンフィグレーションするには、『Oracle CEP IDE Eclipse 開発者ガイド』の「wlevs:channel」で子要素 application-timestamped に関する説明を参照してください。

システム タイムスタンプを持つリレーションまたはストリームの場合、時間はリレーションまたはストリームのデータ ソースでのデータの到着に依存します。指定された時間 (たとえば 1 分など) が経過してもアクティビティが発生しない (ストリームまたはリレーションのソースにデータが到着しない) 場合、Oracle CEP ではシステム タイムスタンプを持つリレーションまたはストリームでハートビートが生成されます。リレーションまたはストリームが指定のソースによって設定されるか、またはハートビートが毎分生成されます。これにより、リレーションまたはストリームの遅れが 1 分を超えることはなくなります。

ハートビートを構成するには、『Oracle CEP IDE Eclipse 開発者ガイド』の「ハートビート」を参照してください。

システム タイムスタンプを持つストリームとリレーションの場合、2 つのイベントが同じ時間値を持つことがないようにシステムによって時間が割り当てられます。ただし、アプリケーション タイムスタンプを持つストリームとリレーションの場合は、イベントが同じ時間値を持つ場合があります。

アプリケーションのタイムスタンプが (非減少ではなく) 厳密に増加することが分かっている場合は、wlevs:channel 属性 is-total-ordertrue に設定できます。これにより、Oracle CEP エンジンでは特定の最適化を行えるようになり、通常は処理のレイテンシの減少につながります。

is-total-order をコンフィグレーションするには、『Oracle CEP IDE Eclipse 開発者ガイド』の「wlevs:application-timestamped」を参照してください。

Oracle CEP スケジューラは、スケジュールのアルゴリズムと頻度に従って、各 Oracle CQL クエリを連続的に実行します。

スケジューラの詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』の「scheduler」を参照してください。

1.2 Oracle CQL 文

Oracle CQL には、以下を作成する文が用意されています。

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

1.2.1 Oracle CQL 文の表記規則

Oracle CEP IDE for Eclipse または Oracle CEP Visualizer を使用して、Oracle CEP CQL プロセッサに関連付けられた XML コンフィグレーション ファイルに Oracle CQL 文を作成します。この XML ファイルはコンフィグレーション ソースと呼ばれます。

コンフィグレーション ソースは wlevs_application_config.xsd スキーマに準拠している必要があり、ruleview、または query 要素のみを含むことができます (例 1-10 を参照)。

例 1-10 通常の Oracle CQL プロセッサ コンフィグレーション ソース ファイル

<?xml version="1.0" encoding="UTF-8"?>
<n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd" 
    xmlns:n1="http://www.bea.com/ns/wlevs/config/application" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
    <name>cqlProcessor</name>
    <rules>
        <view id="lastEvents" schema="cusip bid srcId bidQty ask askQty seq"><![CDATA[ 
            select cusip, bid, srcId, bidQty, ask, askQty, seq 
            from inputChannel[partition by srcId, cusip rows 1]
        ]]></view>
        <view id="bidask" schema="cusip bid ask"><![CDATA[ 
            select cusip, max(bid), min(ask) 
            from lastEvents
            group by cusip
        ]]></view>
            <view ...><![CDATA[
                ...
        ]]></view>
        ...
        <view id="MAXBIDMINASK" schema="cusip bidseq bidSrcId bid askseq askSrcId ask bidQty askQty"><![CDATA[ 
            select bid.cusip, bid.seq, bid.srcId as bidSrcId, bid.bid, ask.seq, ask.srcId as askSrcId, ask.ask, bid.bidQty, ask.askQty             from BIDMAX as bid, ASKMIN as ask 
            where bid.cusip = ask.cusip
        ]]></view>
        <query id="BBAQuery"><![CDATA[ 
            ISTREAM(select bba.cusip, bba.bidseq, bba.bidSrcId, bba.bid, bba.askseq, bba.askSrcId, bba.ask, bba.bidQty, bba.askQty, "BBAStrategy" as intermediateStrategy, p.seq as correlationId, 1 as priority 
            from MAXBIDMINASK as bba, inputChannel[rows 1] as p where bba.cusip = p.cusip)
        ]]></query>
    </rules>
</processor>

Oracle CQL プロセッサのコンポーネント コンフィグレーション ファイルで Oracle CQL クエリを作成する場合は、以下のルールに従います。

  • ruleview、または query 要素につき 1 つの Oracle CQL 文を指定できます。

  • Oracle CQL 文はセミコロンで終わることはできません。

  • 各 Oracle CQL 文は <![CDATA[ および ]]> で囲む必要があります (例 1-10 を参照)。

  • Oracle CQL 文を発行する場合は、文の定義内でスペースを使用する任意の場所に、1 つ以上のタブ、キャリッジ リターン、またはスペースを含めることができます。このため、Oracle CEP では例 1-11例 1-12 の Oracle CQL 文が同じように評価されます。

    例 1-11 Oracle CQL : ホワイトスペースなしの書式設定

    <processor>
        <name>cqlProcessor</name>
        <rules>
            <query id="QTollStr"><![CDATA[ 
                RSTREAM(select cars.car_id, SegToll.toll from CarSegEntryStr[now] as cars, SegToll where (cars.exp_way = SegToll.exp_way and cars.lane = SegToll.lane and cars.dir = SegToll.dir and cars.seg = SegToll.seg))
            ]]></query>
        </rules>
    </processor>
    

    例 1-12 Oracle CQL : ホワイトスペースを含む書式設定

    <processor>
        <name>cqlProcessor</name>
        <rules>
            <query id="QTollStr"><![CDATA[ 
                RSTREAM(
                    select
                        cars.car_id, 
                        SegToll.toll 
                    from 
                        CarSegEntryStr[now]
                    as
                        cars, SegToll 
                    where (
                        cars.exp_way = SegToll.exp_way and 
                        cars.lane = SegToll.lane and 
                        cars.dir = SegToll.dir and 
                        cars.seg = SegToll.seg
                    )
                )
            ]]></query>
        </rules>
    </processor>
    
  • 予約語、キーワード、識別子、およびパラメータでは大文字と小文字は区別されません。ただし、テキスト リテラルと引用名では大文字と小文字が区別されます。

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

  • Oracle CQL 文ではコメントは許可されていません。詳細については、節 2.7「コメント」を参照してください。


注意 :

『Oracle CEP CQL 言語リファレンス』では、わかりやすくするため Oracle CQL 文を ruleview、または query 要素と共に示しています。

1.2.2 Oracle CQL 文のドキュメント表記規則

このリファレンスのすべての Oracle CQL 文は (第 16 章「Oracle CQL 文」を参照)、以下の節に編成されています。

構文 構文図は、文を構成するキーワードとパラメータを示します。


注意 :

すべてのキーワードとパラメータがすべての状況で有効な訳ではありません。各文および句の「セマンティクス」を参照し、構文上の制限を理解するようにしてください。

目的 「目的」では文の基本的な使用について示します。

要件 「要件」では必要な特権、および文を使用する前に実行する必要のある手順を示します。

セマンティクス 「セマンティクス」では構文に含まれるキーワード、パラメータ、および句の目的と、これらに適用される制限およびその他の備考を示します (この章で使用しているキーワードとパラメータの表記規則については、このリファレンスの「はじめに」で説明しています)。

例 「例」では文のさまざまな句とパラメータの使用例を示します。

1.3 Oracle CQL と SQL 標準

Oracle CQL は新しいテクノロジですが、SQL99 のサブセットに基づいています。

Oracle では業界が承認する標準への準拠に努め、SQL 標準調査会に積極的に参加しています。Oracle では Oracle CQL の標準化を積極的に推進しています。

1.4 Oracle CEP サーバとツールのサポート

Oracle CEP サーバおよびツールを使用すると、Oracle CQL を使用する Oracle CEP アプリケーションの作成、パッケージ化、デプロイ、デバッグ、および管理を効率的に行うことができます。

1.4.1 Oracle CEP サーバ

Oracle CEP サーバは、Oracle CEP アプリケーションの軽量な Spring コンテナを提供し、サーバとアプリケーションのライフサイクルを管理します。また、確定的ガベージ コレクションを行う JRockit real-time JVM のほか、Jetty、JMX、JDBC、HTTP パブリッシュ-サブスクライブ、ロギングとデバッグなどの各種の重要なサービスを提供します。

Oracle CEP サーバの詳細については、『Oracle CEP 管理者ガイド』を参照してください。

1.4.2 Oracle CEP ツール

Oracle CEP では、Oracle CQL 開発プロセスを簡素化する以下のツールが提供されます。

  • Oracle CEP IDE for Eclipse : Oracle CEP アプリケーション開発の完全なライフサイクルをサポートする Eclipse ベースの統合開発環境。Oracle CQL 構文のハイライト表示と検証、グラフィカルなイベント処理ネットワーク エディタ、コンポーネントとアプリケーション アセンブリのコンフィグレーション ファイルの効率的な管理などが含まれます。

    詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』を参照してください。

  • Oracle CEP Visualizer : Oracle CEP アプリケーション、クエリ、キャッシュ、およびクラスタ化の実行時のコンフィグレーションと管理を提供する、豊富な機能を備えた Oracle CEP のグラフィカル ユーザ インタフェース。

    詳細については、『Oracle CEP Visualizer ユーザ ガイド』を参照してください。