ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Event Processing CQL言語リファレンス
11gリリース1 (11.1.1.7)
B61613-06
  目次へ移動
目次

前
 
次
 

20 Oracle CQLの問合せ、ビューおよび結合

この章では、Oracle Continuous Query Language (Oracle CQL)の問合せ、ビューおよび結合のリファレンスと使用方法のガイドラインを提供します。 Oracle CQLの問合せおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。

QUERY文を使用して作成した最上位のSELECT文は問合せと呼ばれます。

VIEW文を使用して作成した最上位のVIEW文はビューと呼ばれます(Oracle CQLでの副問合せ)。

結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。

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

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

20.1 Oracle CQLの問合せ、ビューおよび結合の概要

Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリームまたはビューからデータを取得するために、Oracle Event Processing CQLプロセッサで実行される操作です。詳細は、20.2項「問合せ」を参照してください。

Oracle CQLビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQLでは、副問合せのかわりにビューを使用します。詳細は、20.3項「ビュー」を参照してください。

Oracle Event Processingでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。詳細は、20.4項「結合」を参照してください。

例20-1は、procという名前のプロセッサのOracle CQLプロセッサ・コンポーネント構成ファイルに定義された一般的なOracle CQL問合せを示します。

例20-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>proc</name>
        <rules>
            <view id="lastEvents" schema="cusip mbid srcId bidQty ask askQty seq"><![CDATA[ 
                select cusip, mod(bid) as mbid, srcId, bidQty, ask, askQty, seq 
                from filteredStream[partition by srcId, cusip rows 1]
            ]]></view>
            <query id="q1"><![CDATA[
                SELECT *
                FROM   lastEvents [Range Unbounded]
                WHERE  price > 10000
            ]]></query>
        </rules>
    </processor>
</n1:config>

例20-1に示すように、rules要素の子要素viewまたはqueryには各Oracle CQL文が含まれています。

各Oracle CQL文は<![CDATA[ ... ]]>タグで囲み、末尾にセミコロン(;)は付けません

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

20.1.1 Oracle CQL問合せの作成方法

一般に、Oracle CQLの問合せおよびビューは、Oracle Event Processing IDE for Eclipseを使用して作成します。デプロイメント後に、Oracle Event Processing Visualizerを使用してOracle CQLの問合せを追加、変更および削除できます。

Oracle CQL問合せを作成するには:

  1. Oracle Event Processing IDE for Eclipseを使用して、Oracle Event Processingアプリケーションとイベント処理ネットワーク(EPN)を作成します。

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

    • 『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processing IDE for Eclipseのプロジェクトに関する項

    • 『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processing IDE for Eclipseとイベント処理ネットワークに関する項

  2. EPNエディタでOracle CQLプロセッサを右クリックし、「構成のソースに移動」を選択します(図20-1を参照)。

    図20-1 EPNエディタからのプロセッサの構成ソースへの移動

    図20-1の説明が続きます
    「図20-1 EPNエディタからのプロセッサの構成ソースへの移動」の説明

    EPNエディタでこのプロセッサの対応するコンポーネント構成ファイルが開き、該当するprocessor要素にカーソルが置かれます(図20-2を参照)。

    図20-2 プロセッサの構成ソースの編集

    図20-2の説明が続きます
    「図20-2 プロセッサの構成ソースの編集」の説明

  3. 問合せとビューを作成し、ユーザー定義の関数とウィンドウを登録します。

    例については、次の項を参照してください。

  4. Oracle Event Processing IDE for Eclipseを使用して、Oracle Event Processingアプリケーションをパッケージ化し、Oracle Event Processingサーバーにデプロイします。

    詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processingアプリケーションのアセンブルとデプロイに関する項を参照してください。

  5. デプロイメント後、Oracle Event Processing Visualizerを使用してOracle Event Processingアプリケーションを変更、追加および削除します。

    詳細は、『Oracle Fusion Middleware Oracle Event Processing Visualizerユーザーズ・ガイド』のOracle CQLルールの管理に関する項を参照してください。

20.2 問合せ

問合せは、データ・ストリームおよびビューからの情報を抽出する主な手段です。

query::=

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

query句自体は、次のいずれかの部分で構成されます。

次の項では、作成できる基本的な問合せの種類について説明しています。

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

20.2.1 問合せの構成要素

この項では、Oracle CQL問合せの作成に使用する基本的な構成要素について概説します。

20.2.1.1 Select、From、Whereブロック

sfw_blockを使用して、Oracle CQL問合せの select、from、およびオプションのwhere句を指定します。

sfw_block::=

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

sfw_blockは次の部分で構成されます。

20.2.1.2 Select句

問合せの結果セットに必要なストリーム要素を指定するには、この句を使用します。select_clauseでは*演算子を使用してすべてのストリーム要素を指定するか、1つ以上のストリーム要素のリストを指定できます。

select_clause::=

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

SELECTキーワードの後で、from_clauseの前に置かれた式のリストはselectリストと呼ばれます。selectリストでは、1つ以上のストリームまたはビューからOracle Event Processingによって返される要素のセットで1つ以上のストリーム要素を指定します。ストリーム要素の個数、データ型および長さはselectリストの要素によって決まります。

選択した重複タプルの各セットで1つのコピーのみが返されるようにするには、オプションでdistinctを指定します。重複タプルとはselectリスト内の各式と一致する値を持つタプルです。

詳細は、select_clause::=を参照してください。

20.2.1.3 From句

select_clauseで指定されたストリーム要素を提供するストリームおよびビューを指定するには、この句を使用します(20.2.1.2項「Select句」を参照)。

from_clauseでは、1つ以上のカンマ区切りのrelation_variable句を指定できます。

from_clause::=

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

詳細は、from_clause::=を参照してください。

relation_variable::=

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

relation_variable句で指定された任意のデータ・ソースから選択できます。

relation_variable句のAS演算子で別名を定義してselectリストの直前の式にラベルを付け、その名前で結果を参照できます(2.7.1.1項「relation_variable句の別名」を参照)。

共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーション間で結合を作成する場合は(20.4項「結合」を参照)、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例20-2は、ストリーム名を使用して、OrderStreamcustomerIDストリーム要素とCustomerStreamcustomerIDストリーム要素を区別する方法を示します。

例20-2 完全修飾されたストリーム要素名

<query id="q0"><![CDATA[ 
    select * from OrderStream, CustomerStream 
    where 
        OrderStream.customerID = CustomerStream.customerID
]]></query>

それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle Event Processingでの処理が軽減されます。

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

20.2.1.4 Where句

select_clauseで結果が返される条件を指定するには、このオプションの句を使用します(20.2.1.2項「Select句」を参照)。

Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。

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

20.2.1.5 Group By句

結果をグループ化(分割)するには、このオプションの句を使用します。この句では、結果セットの順序は保証されません。グループ化を並べ替えるには、order by句を使用します。

Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。

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

20.2.1.6 Order By句

すべての結果または上位n個の結果を並べ替えるには、このオプションの句を使用します。

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

20.2.1.7 Having句

返されたストリーム要素のグループを指定されたconditionTRUEのグループに制限するには、このオプションの句を使用します。この句を省略すると、Oracle Event Processingではすべてのグループのサマリー結果が返されます。

Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。

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

20.2.1.8 Binary句

2つの問合せまたはビューで返されるタプルで次の集合演算を実行するには、binary句を使用します。

  • EXCEPT

  • MINUS

  • INTERSECT

  • UNIONUNION ALL

  • INNOT IN

詳細は、binary::=を参照してください。

20.2.1.9 IDStream句

select-from-where句またはbinary句を使用し、その結果をIStreamまたはDStreamのいずれかのリレーションからストリームへの演算子として返すには、この句を使用します。

IStreamまたはDstream演算子とusing_clauseを組み合せることで、問合せ結果の差分を簡単に検出できます。

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

20.2.2 単純な問合せ

例20-3に、単一のストリームからすべてのストリーム要素を選択する単純な問合せを示します。

例20-3 単純な問合せ

<query id="q0"><![CDATA[ 
    select * from OrderStream where orderAmount > 10000.0
]]></query>

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

20.2.3 組込みウィンドウの問合せ

例20-4に、組込みのタプルベースのストリームからリレーションへのウィンドウ演算子を使用して、スキーマ(c1 integer, c2 float)を持つストリームS2からすべてのストリーム要素を選択する問合せを示します。

例20-4 組込みウィンドウの問合せ

<query id="BBAQuery"><![CDATA[ 
    select * from S2 [range 5 minutes] where S2.c1 > 10
]]></query>

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

20.2.4 MATCH_RECOGNIZEの問合せ

例20-5に、ItemTempStreamのストリーム要素間の複雑な関係を表すMATCH_RECOGNIZE句を使用する問合せを示します。

例20-5 MATCH_RECOGNIZEの問合せ

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

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

20.2.5 リレーショナル・データベース表の問合せ

Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。

詳細は、20.6項「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。

20.2.6 XMLTABLEの問合せ

この問合せを使用して、XPathまたはXQuery式の結果をタプルにマップします。

XMLTABLEには次の副句があります。

  • XMLNAMESPACES: オプション。問合せの式で使用できる一連のXMLネームスペースの宣言を持つ文字列。

  • XQuery_string: XMLの問合せに使用するためのXQueryまたはXPath文字列を持つ文字列。

  • PASSING BY VALUE: 入力に使用されるXMLを指します。

  • COLUMNS: オプション。結果の出力プロパティを定義します。

    • PATH: オプション。そのプロパティの値をXMLから取得する場所を指すXPath式を指定するCOLUMNSの副句。

例20-6は、ビューv1と、そのビューに対する問合せq1を示します。ビューはxmltypeストリーム要素を持つストリームS1から選択します。ビューv1XMLTABLE句でXPath式を使用して、xmltypeストリーム要素のデータを解析します。ビューのスキーマのデータ型は、COLUMNS句で解析されたデータのデータ型と一致します。問合せq1は他の任意のデータ・ソースの場合と同様に、このビューから選択します。XMLTABLE句はXMLネームスペースもサポートしています。

その他の例は、「XMLTABLEの問合せの例」および「XMLネームスペースを持つXMLTABLEの問合せの例」を参照してください。

例20-6 XMLTABLEの問合せ

<view id="v1" schema="orderId LastShares LastPrice"><![CDATA[ 
    SELECT 
        X.OrderId, 
        X.LastShares, 
        X.LastPrice 
    FROM S1,
    XMLTABLE (
        "//FILL" 
        PASSING BY VALUE 
        S1.c1 as "." 
        COLUMNS 
            OrderId char(16) PATH "fn:data(../@ID)", 
            LastShares integer PATH "fn:data(@LastShares)", 
            LastPrice float PATH "fn:data(@LastPx)"
    ) as X
]]></view>

<query id="q1"><![CDATA[ 
    IStream(
        select 
            orderId, 
            sum(LastShares * LastPrice), 
            sum(LastShares * LastPrice) / sum(LastShares)
        from 
            v1[now] 
        group by orderId
    )
]]></query>

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

20.2.7 関数TABLEの問合せ

TABLE句を使用して、Oracle CQL問合せのFROM句内の組込みまたはユーザー定義関数から返された複数の行にアクセスします。TABLE句は返された複数の行をOracle CQLリレーションに変換します。これは外部リレーションであるため、TABLE関数句とストリームを結合する必要があります。

table_clause::=

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

(object_expr::=identifier::=datatype::=)

次の点に注意してください。

  • 関数は、配列型またはCollection型を返す必要があります。

  • TABLE関数句とストリームを結合する必要があります。

例20-7は、1つのパラメータ(InputPoints.point)を渡して、Oracle SpatialメソッドgetContainingGeometriesを呼び出すデータ・カートリッジTABLE句を示しています。このメソッドの戻り値Collectionには別名validGeometriesが作成されます。TABLE句が戻すリレーションには別名R2が作成されます。

例20-7 データ・カートリッジTABLEの問合せ

<query id="q1"><![CDATA[ 
RSTREAM (
    SELECT 
        R2.validGeometries.shape as containingGeometry,
        R1.point as inputPoint
    FROM 
        InputPoints[now] as R1,
        TABLE (getContainingGeometries@spatial (InputPoints.point) as validGeometries) AS R2
)
]]></query>

例20-8に、パラメータを指定せずに関数getAllGeometries@spatialを呼び出したために、データ・カートリッジTABLE句と別のストリームとの結合に失敗した、無効なデータ・カートリッジTABLEの問合せを示します。Oracle Event Processingでは、結合ストリームに要素が到着したときにのみデータ・カートリッジ・メソッドを呼び出します。

例20-8 無効なデータ・カートリッジTABLEの問合せ

<query id="q2"><![CDATA[ 
RSTREAM (
    SELECT 
        R2.validGeometries.shape as containingGeometry
    FROM 
        TABLE (getAllGeometries@spatial () as validGeometries) AS R2
)
]]></query>

その他の例については、次の項を参照してください。

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

20.2.8 キャッシュの問合せ

Oracle CQLプロセッサを使用すると、キャッシュをイベント・ソースとして指定できます。Nowウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。

Oracle Event Processingのキャッシュ・イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。

詳細は、20.5項「Oracle CQL問合せとOracle Event Processingサーバー・キャッシュ」を参照してください。

20.2.9 問合せ結果のソート

問合せで選択された行を並べ替えるには、ORDER BY句を使用します。

order_by_clause::=

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

(order_by_list::=)

次の場合は、位置によるソートが役立ちます。

  • selectリストの式が長い場合に並べ替えを行うには、式全体を繰り返すかわりにORDER BY句で位置を指定できます。

  • UNIONINTERSECTMINUSまたはUNION ALLなどの集合演算子を含む複合問合せの場合、ORDER BY句では明示的な式のかわりに位置または別名を指定する必要があります。また、ORDER BY句は最後のコンポーネント問合せでのみ使用できます。ORDER BY句は、複合問合せ全体で返されたすべての行の並べ替えを行います。

Oracle Event ProcessingでORDER BY句の値がソートされるメカニズムはJavaロケールで指定されます。

20.2.10 問合せ結果の差分の検出

DIFFERENCE USING句を使用すると、問合せのIStreamまたはDStreamの差分を簡単に検出できます。

using_clause::=

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

(usinglist::=)

例20-9に示すような問合せがあるとします。

例20-9 DIFFERENCE USING句

<query id="q0">
    ISTREAM (
        SELECT c1 FROM S [RANGE 1 NANOSECONDS]
    )    DIFFERENCE USING (c1)
</query>

表20-1に、この問合せのサンプル入力を示します。リレーション列にはリレーションS [RANGE 1 NANOSECONDS]の内容を示し、出力列にはDIFFERENCE USINGを適用後の問合せ結果を示します。この句を使用すると、IStream出力の差分のみを簡単に検出できます。

表20-1 DIFFERENCE USING句のIStreamへの作用

入力 リレーション 出力

1000:    +5

{5}

+5

1000:    +6

{5, 6}

+6

1000:    +7

{5, 6, 7}

+7

1001:    +5

{5, 6, 7, 5}


1001:    +6

{5, 6, 7, 5, 6}


1001:    +7

{5, 6, 7, 5, 6, 7}


1001:    +8

{5, 6, 7, 5, 6, 7, 8}

+8

1002:    +5

{5, 6, 7, 5, 6, 7, 8, 5}


1003:    -5

{5, 6, 7, 5, 6, 7, 8}


1003:    -5

{5, 6, 7, 6, 7, 8}


1003:    -5

{6, 7, 6, 7, 8}


1003:    -6

{6, 7, 7, 8}


1003:    -6

{7, 7, 8}


1003:    -7

{7, 8}


1003:    -7

{8}


1003:    -8

{}



1004:    +5

{5}

+5


DIFFERENCE USING句でusinglistを指定する場合、次の項目で列を指定できます。

  • 属性名: 属性名で選択する場合に、このオプションを使用します。

    例20-10は、DIFFERENCE USING句のusinglistの属性名c1を示しています。

  • 別名: 別名が指定されている式の結果を含める場合に、このオプションを使用します。

    例20-10は、DIFFERENCE USING句のusinglistの別名logvalを示しています。

  • 位置: 別名が指定されていない式の結果を含める場合に、このオプションを使用します。

    位置は、左から右に読み取る、1で始まる正の整数の、定数として指定します。

    例20-10では、式funct(c2, c3)の結果を、DIFFERENCE USING句のusinglistで位置(3)によって示しています。

例20-10 DIFFERENCE USING句でのusinglistの指定

<query id="q1">
    ISTREAM (
        SELECT c1, log(c4) as logval, funct(c2, c3) FROM S [RANGE 1 NANOSECONDS]
    )    DIFFERENCE USING (c1, logval, 3)
</query>

DIFFERENCE USING句は、IStream演算子とDStream演算子の両方で使用できます。

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

20.2.11 パラメータ化された問合せ

Oracle CQL問合せをパラメータ化し、:n文字列をプレースホルダーとして使用して、実行時にパラメータ値をバインドできます。ここで、nは、params要素内の置換値の位置に相当する正の整数です。


注意:

ビューをパラメータ化することはできません。


例20-11に、パラメータ化されたOracle CQL問合せを示します。

例20-11 パラメータ化されたOracle CQL問合せ

<n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    ...
    <processor>
        <name>myProcessor</name>
        <rules>
            <query id="MarketRule"><![CDATA[ 
                 SELECT symbol, AVG(price) AS average, :1 AS market
                 FROM StockTick [RANGE 5 SECONDS]
                 WHERE symbol = :2
            ]]></query>
        </rules>
        <bindings>
            <binding id="MarketRule">
                <params id="nasORCL">NASDAQ, ORCL</params>
                <params id="nyJPM">NYSE, JPM</params>
                <params id="nyWFC">NYSE, WFC</params>
            </binding>
        </bindings>
    </processor>
    <processor>
        <name>summarizeResults</name>
        <rules>
            <query id="SummarizeResultsRule"><![CDATA[ 
                select  
                    crossRate1 || crossRate2 as crossRatePair,
                    count(*) as totalCount,
                    :1 as averageInternalPrice
                from CrossRateStream 
                group by crossRate1,crossRate2 
                having :2 
            ]]></query>
        </rules>
        <bindings>
            <binding id="SummarizeResultsRule">
                <params id="avgcount">avg(internalPrice), count(*) > 0</params>
            </binding>           
        </bindings>
    </processor>
</n1:config>

この例では、次を想定しています。

  • MarketRule問合せでは、SELECT内の3番目の項とWHERE句内のsymbolの値の2つのパラメータが指定されます。

  • SummarizeResultsRule問合せでは、SELECT内の3番目の項とHAVING句の値の2つのパラメータが指定されます。

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

20.2.11.1 Oracle CQL文内のパラメータ化された問合せ

Oracle CQL文の中で算術式またはStringリテラルが有効な任意の場所に、プレースホルダーを指定できます。例:

  • SELECTリストの項目

  • WHERE句の記述

  • WINDOWコンストラクト(RANGESLIDEROWSおよびPARTITION BYなど)

  • PATTERN期間句

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

20.2.11.2 bindings要素

パラメータ値は、bindings要素によって包含されます。processorごとに1つのbindings要素がある場合があります。

各パラメータ化された問合せについて、bindings要素に、問合せと同じidbinding要素が含まれている必要があります。

binding要素には、1つ以上のparams要素が含まれている必要があります。各params要素には、一意のid、および対応する問合せ内のプレースホルダー文字(:n)の数と等しいパラメータ値のカンマ区切りのリストが含まれている必要があります。

パラメータ値の順序は、:1は最初のパラメータ値、:2は2番目のパラメータ値などというように、パラメータ化された問合せ内のプレースホルダー文字(:n)に相当します。プレースホルダー文字(:n)は任意の順序で使用できます。つまり、:1は、問合せ内で:2の前か後の最初のパラメータ値に相当します。1つのプレースホルダーの番号は問合せ内で1回のみ使用できます。

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

20.2.11.3 実行時の問合せのネーミング

バインディングによってパラメータ化された問合せがインスタンス化される際、Oracle Event Processingでは、queryId_paramIdという名前の新しい問合せが実行時に作成されます。たとえば例20-11に示すように、MarketRuleバインディングによってインスタンス化される最初の問合せの実行時の名前はMarketRule_nasORCLになります。

実行時のネーミングの競合を回避するため、問合せのIDおよびパラメータIDの組合せが一意であることを確認してください。

20.2.11.4 パラメータ値の表記規則

params要素には、一意のid、および対応する問合せ内のプレースホルダー文字(:n)の数と等しいパラメータ値のカンマ区切りのリストが含まれている必要があります。

表20-2 パラメータ化された問合せのパラメータ値の表記規則

規則 置換値

プリミティブ・タイプ・リテラル

<params id="p1">NASDAQ, 200.0</params>

:1 = NASDAQ

:2 = 200.0

Oracle CQLフラグメント

<params id="p1">count(*), avg(val)</params>

:1 = count(*)

:2 = avg(val)

引用符

<params id="p1">'alert', "Seattle, WA", 'fun' || "house", one "two" 3</params>

:1 = 'alert'

:2 = "Seattle, WA"

:3 = 'fun' || "house"

:4 = one "two" 3


Oracle CQL問合せでは、一重または二重引用符内のプレースホルダーはStringリテラルです。次の問合せはパラメータ化された問合せではありません。

SELECT ":1" as symbol, price FROM StockTick [RANGE 5 SECONDS]

Oracle Event Processingでは、この問合せはStringリテラル":1"を別名symbolに割り当てるものとして解析されます。この問合せをパラメータ化された問合せにするには、次を使用します。

SELECT :1 as symbol, price FROM StockTick [RANGE :2 SECONDS]

さらに、次のようにparams要素を定義します。

<params id="p1">"ORCL", 5</params>

パラメータ値(ORCL)にはカンマは含まれないので引用符は必要ありません。paramsは次のように指定できます。

<params id="p1">ORCL, 5</params>

ただし、パラメータ値にカンマが含まれる場合は、パラメータ値を引用符で囲む必要があります。次のようなパラメータ化された問合せがあるとします。

SELECT :1 = cityAndState AS cityOfInterest FROM channel1 [RANGE :2 SECONDS]

ここで、cityAndStateには、"Seattle, WA"または"Ottawa, ON"などの値が含まれます。この場合、params要素を次のように指定する必要があります。

<params id="p1">"Seattle, WA", 5</params>
<params id="p1">"Ottawa, ON", 5</params>

カンマは、文字列値を示す引用符で囲まれたパラメータ値内でのみ使用できます。カンマは、引用符で囲まれていないパラメータ値では使用できません。例:

"Seattle, WA"は、カンマが文字列の一部なので有効です。

PARTITION BY fromRate,toRate ROWS 10は無効です。かわりに次の2つのパラメータを作成します。

PARTITION BY fromRate ROWS 10
PARTITION BY toRate ROWS 10

20.2.11.5実行時にパラメータ化された問合せ

params要素により、新しいパラメータを使用して新しいOracle CQL問合せが効率的に実行されます。ルールの実行時に、Oracle CQLはパラメータ値を左から右に向かってプレースホルダー文字に置換します。例20-11は、例20-12で示されている問合せと事実上等価です。

例20-12 実行時に同等な問合せ

SELECT symbol, AVG(price) AS average, NASDAQ AS market
FROM StockTick [RANGE 5 SECONDS]
WHERE symbol = ORCL

SELECT symbol, AVG(price) AS average, NYSE AS market
FROM StockTick [RANGE 5 SECONDS]
WHERE symbol = JPM

SELECT symbol, AVG(price) AS average, NYSE AS market
FROM StockTick [RANGE 5 SECONDS]
WHERE symbol = WFC

20.2.11.6 プログラム的なパラメータの置換

CQLProcessorMBean.replaceAllBoundParameters()メソッドを使用して、パラメータ化された問合せ内のパラメータをプログラム的に置換する場合、メソッドによって置換されない既存のパラメータはすべて問合せから自動的に削除されます。

20.3 ビュー

問合せは、データ・ストリームおよびリレーションからの情報を抽出する主な手段です。ビューは、ストリームまたはリレーションでの代替の選択項目を表し、副問合せの作成に使用できます。

ビューは、同じプロセッサにある問合せからのみアクセス可能で、この範囲を越えて公開することはできません。

ビューの定義で、任意の問合せタイプを指定できます。詳細は、20.2項「問合せ」を参照してください。

view文の詳細は、「View」を参照してください。

例20-13では、問合せBBAQueryはビューMAXBIDMINASKからの選択を行い、このビューはBIDMAXなどの他のビューからの選択を行い、それらのビューはさらに他のビューからの選択を行います。最終的に、lastEventsなどのビューが実際のイベント・ソースであるfilteredStreamからの選択を行います。これらの各ビューは、1つ以上の基本ストリームから派生した個別のストリームを表しています。

例20-13 副問合せのかわりとしてのビューの使用

<view id="lastEvents" schema="cusip bid srcId bidQty ask askQty seq"><![CDATA[ 
    select cusip, bid, srcId, bidQty, ask, askQty, seq 
    from filteredStream[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 id="bid" schema="cusip bid seq"><![CDATA[ 
    select ba.cusip as cusip, ba.bid as bid, e.seq 
    from bidask as ba, lastEvents as e
    WHERE e.cusip = ba.cusip AND e.bid = ba.bid
]]></view>
<view id="bid1" schema="cusip maxseq"><![CDATA[ 
    select b.cusip, max(seq) as maxseq
    from bid as b 
    group by b.cusip  
]]></view>
<view id="BIDMAX" schema="cusip seq srcId bid bidQty"><![CDATA[ 
    select e.cusip, e.seq, e.srcId, e.bid, e.bidQty
    from bid1 as b, lastEvents as e
    where (e.seq = b.maxseq) 
]]></view>
<view id="ask" schema="cusip ask seq"><![CDATA[ 
    select ba.cusip as cusip, ba.ask as ask, e.seq
    from bidask as ba, lastEvents as e
    WHERE e.cusip = ba.cusip AND e.ask = ba.ask
]]></view>
<view id="ask1" schema="cusip maxseq"><![CDATA[ 
    select a.cusip, max(seq) as maxseq 
    from ask as a
    group by a.cusip
]]></view>
<view id="ASKMIN" schema="cusip seq srcId ask askQty"><![CDATA[ 
    select e.cusip, e.seq, e.srcId, e.ask, e.askQty 
    from ask1 as a, lastEvents as e 
    where (e.seq = a.maxseq)
]]></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, filteredStream[rows 1] as p where bba.cusip = p.cusip)
]]></query>

この方法を使用して、副問合せと同様の結果を得ることができます。ただし、ビューを使用することで、問合せの複雑さをより柔軟に制御でき、名前によって他の問合せでビューを再利用できます。

20.3.1 ビューと結合

共通するストリーム要素名を持つ複数のビューで結合を作成する場合は、ストリームの名前を使用してストリーム要素名を修飾する必要があります。例20-14は、ビュー名を使用して、BIDMAXビューのseqストリーム要素とASKMINビューのseqストリーム要素を区別する方法を示します。

例20-14 ビュー名を使用した同名のストリーム要素の区別

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

それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム要素は常に明示的に参照することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle Event Processingでの処理が軽減されます。

詳細は、20.4項「結合」を参照してください。

20.3.2 ビューとスキーマ

イベント属性名のスペース区切りリストを使用して、ビューのオプションのスキーマを定義できます(例20-15を参照)。

例20-15 イベント属性名のみを持つスキーマ

<view id="MAXBIDMINASK" schema="cusip bidseq"><![CDATA[ 
    select ... 
]]></view>

20.4 結合

結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。Oracle Event Processingでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。問合せのselectリストでは、それらの任意のストリームから任意のストリーム要素を選択できます。いずれか2つのストリームで共通するストリーム要素名がある場合は、ストリーム名を使用して、問合せ全体を通じてそれらのストリーム要素に対するすべての参照を修飾し、曖昧さを避ける必要があります。

共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーションで結合を作成する場合は、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例20-16は、ストリーム名を使用して、OrderStreamストリームのcustomerIDストリーム要素と CustomerStreamストリームのcustomerIDストリーム要素を区別する方法を示します。

例20-16 完全修飾されたストリーム要素名

<query id="q0"><![CDATA[ 
    select * from OrderStream[range 5] as orders, CustomerStream[range 3] as customers where 
        orders.customerID = customers.customerID
]]></query>

それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle Event Processingでの処理が軽減されます。

Oracle Event Processingでは、次のタイプの結合をサポートします。


注意:

キャッシュに対して結合を行う場合は、20.5.1項「キャッシュに対する結合の作成」に説明されている追加の問合せの制限に従う必要があります。


20.4.1 内部結合

デフォルトでは、Oracle Event Processingは内部結合(単純結合とも呼ばれる)を実行します。これは、複数のストリームから結合条件を満たすストリーム要素のみを返す結合です。

例20-17は、スキーマ(c1 integer, c2 float)を持つストリームS0と、スキーマ(c1 integer, c2 float)を持つストリームS1の間で、内部結合を使用する問合せq4を作成する方法を示します。

例20-17 内部結合

<query id="q4"><![CDATA[ 
    select * 
        from 
            S0[range 5] as a, 
            S1[range 3] as b 
        where 
            a.c1+a.c2+4.9 = b.c1 + 10
]]></query>

20.4.2 外部結合

外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他の表に結合条件を満たす行が含まれていなくても表の一部またはすべての行が返されます。

外部結合は、LEFTまたはRIGHT OUTER JOIN ... ON構文を使用して、問合せのFROMで指定します。

from_clause::=

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

(non_mt_relation_list::=relation_variable::=non_mt_cond_list::=)

例20-18は、スキーマ(c1 integer, c2 float)を持つストリームS0と、スキーマ(c1 integer, c2 float)を持つストリームS1の間で、左外部結合を使用する問合せq5を作成する方法を示します。

例20-18 外部結合

<query id="q5"><![CDATA[ 
    SELECT a.c1+b.c1 
    FROM S0[range 5] AS a LEFT OUTER JOIN S1[range 3] AS b ON b.c2 = a.c2
    WHERE b.c2 > 3
]]></query>

ON句を使用して結合条件を指定します。これにより、WHERE句の検索条件またはフィルタ条件とは別個に結合条件を指定できます。

次の種類の外部結合を実行できます。

20.4.2.1 左外部結合

ストリームAおよびBの外部結合を実行し、Aのすべてのストリーム要素を返す(左外部結合の)問合せを作成するには、例20-19に示すように、FROM句でLEFT OUTER JOIN構文を使用します。Bに一致するストリーム要素がないAのすべてのストリーム要素については、Oracle Event ProcessingによってBのストリーム要素を含むselectリスト式でnullが返されます。

例20-19 左外部結合

<query id="q5"><![CDATA[ 
    SELECT a.c1+b.c1 
    FROM S0[range 5] AS a LEFT OUTER JOIN S1[range 3] AS b  ON b.c2 = a.c2
    WHERE b.c2 > 3
]]></query>

20.4.2.2 右外部結合

ストリームAおよびBの外部結合を実行し、Bのすべてのストリーム要素を返す(右外部結合の)問合せを作成するには、例20-20に示すように、FROM句でRIGHT OUTER JOIN構文を使用します。Aに一致するストリーム要素がないBのすべてのストリーム要素については、Oracle Event ProcessingによってAのストリーム要素を含むselectリスト式でnullが返されます。

例20-20 右外部結合

<query id="q5"><![CDATA[ 
    SELECT a.c1+b.c1 
    FROM S0[range 5] AS a RIGHT OUTER JOIN S1[range 3] AS b ON b.c2 = a.c2
    WHERE b.c2 > 3
]]></query>

20.4.2.3 外部結合の見直し

前の外部結合を参照する、または見直す外部結合を作成できます(例20-21を参照)。

例20-21 外部結合の見直し

<query id="q5"><![CDATA[ 
    SELECT R1.c1+R2.c1 
    FROM S0[rows 2] as R1 LEFT OUTER JOIN S1[rows 2] as R2 on R1.c2 = R2.c2 RIGHT OUTER JOIN S2[rows 2] as R3 on R2.c2 = R3.c22
    WHERE R2.c2 > 3
]]></query>

20.5 Oracle CQL問合せとOracle Event Processingサーバー・キャッシュ

Oracle CQL文またはユーザー定義関数からOracle Event Processingキャッシュにアクセスできます。

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

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

20.5.1 キャッシュに対する結合の作成

キャッシュに対して結合を行うOracle CQL問合せを作成する場合、次の制限に従う必要があります。

詳細は、20.4項「結合」を参照してください。

20.5.1.1 最初のキャッシュ・キーおよび単純な同値

キャッシュ・キー属性に対する比較演算を持つ複合述語の(左から)1番目の副句には、単純な同値述語しか使用できません。

述語がキャッシュ属性を参照する(左から)1番目の副句ではないため、次の述語は無効です。

... S.c1 = 5 AND CACHE.C2 = S.C2 AND CACHE.C1 = S.C1 ...

しかし、次の述語は有効です。

... S.c1 = 5 AND CACHE.C1 = S.C1 AND CACHE.C2 = S.C2 ...

20.5.1.2 キャッシュ・キーで算術演算は使用できない

副句で、キャッシュ・キー属性に対する算術演算は使用できません。

キャッシュ・キー属性では算術演算を使用できないため、次の述語は無効です。

... CACHE.C1 + 5 = S.C1 AND CACHE.C2 = S.C2 ...

20.5.1.3 全体スキャンは使用できない

複合述語で、キャッシュの全体スキャンは使用できません。

キャッシュのキャッシュ・キーがC1であるとします。

次の述語は無効です。比較でキャッシュ・キー属性が使用されておらず、キャッシュ全体のスキャンが必要ですが、全体スキャンは許可されていないためです。

... CACHE.C2 = S.C1 ...

... CACHE.C2 > S.C1 ...

... S.C1 = S.C2 ...

... S.C1 = CACHE.C2 AND S.C2 = CACHE.C2 ...

次の述語も無効です。比較でキャッシュ・キー属性が使用されていますが、キャッシュ全体のスキャンが必要な非等値演算が使用されており、全体スキャンは許可されていないためです。

... CACHE.C1 != S.C1 ...

... CACHE.C1 > 5 ...

... CACHE.C1 + 5 = S.C1 ...

次の述語も無効です。比較でキャッシュ・キー属性が使用されていますが、キャッシュ属性を参照している最初の副句がキャッシュ・キー属性(この例ではC1)を参照していません。すなわち、最初の副句はキャッシュ・キーではないC2を参照しており、キャッシュ・キー比較副句(CACHE.C1 = S.C1)が非キー比較副句の後に置かれています。

 ... CACHE.C2 = S.C2 AND CACHE.C1 = S.C1 ...

20.5.1.4 複数の条件と非等値

複数の条件、非等値(またはその両方)を使用するには、最初の副句をキャッシュ・キー値を比較する同値述語にし、残りの述語副句を1つのAND演算子で区切って指定する必要があります。

次に、有効な述語を示します。

... S.c1 = 5 AND CACHE.C1 = S.C1 AND CACHE.C2 > S.C2 ...

... CACHE.C1 = S.C1 AND CACHE.C2 = S.C2 ...

... S.c1 = 5 AND CACHE.C1 = S.C1 AND CACHE.C2 != S.C2 ...

20.6 Oracle CQL問合せとリレーショナル・データベース表

リレーショナル・データベース表には、次を使用してOracle CQL問合せからアクセスできます。

いずれの場合でも、データソースはOracle Event Processing JDBCサーバーのconfig.xmlファイルで定義する必要があります。詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。

Oracle Event Processingのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。

20.7 Oracle CQL問合せとOracleデータ・カートリッジ

Oracle CQL問合せ内のOracle CQLデータ・カートリッジ・タイプには、Oracle CQLネイティブ・タイプの場合と同様の方法でアクセスできます。

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