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

戻る
戻る
 
次へ
次へ
 

14 Oracle CQL のクエリ、ビュー、および結合

Oracle CQL のクエリおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。

[REGISTER|CREATE] QUERY 文を使用して作成した最上位の SELECT 文はクエリと呼ばれます。

[REGISTER|CREATE] VIEW 文を使用して作成した最上位の VIEW 文はビューと呼ばれます (Oracle CQL でのサブクエリ)。

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

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

14.1 Oracle CQL のクエリ、ビュー、および結合の概要

Oracle CQL クエリは、Oracle CQL 構文で表され、1 つ以上のストリームまたはビューからのデータを処理するために Oracle CEP CQL プロセッサで実行される操作です。詳細については、節 14.2「クエリ」を参照してください。

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

Oracle CEP では、クエリの FROM 句に複数のストリームがある場合は常に結合が行われます。詳細については、節 14.4「結合」を参照してください。

例 14-1 は、proc という名前の Oracle CQL プロセッサ コンポーネントのコンフィグレーション ファイルに定義された一般的な Oracle CQL クエリを示します。

例 14-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>
            <rule id="range_slide"><![CDATA[ 
                register window range_slide(winrange int, winslide int) implement using "MyRangeSlideWindow"
            ]]></rule>
            <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 [Now]
                WHERE  price > 10000
            ]]></query>
        </rules>
    </processor>
</n1:config>

例 14-1 で示されるように、rules 要素の子要素 ruleviewquery には各 Oracle CQL 文が含まれています。

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

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

Oracle CQL クエリを作成するには :

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

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

  2. EPN エディタで Oracle CQL プロセッサを右クリックし、[Go to Configuration Source] を選択します (図 14-1 を参照)。

    図 14-1 EPN エディタからのプロセッサのコンフィグレーション ソースへの移動

    図 14-1 の説明
    「図 14-1 EPN エディタからのプロセッサのコンフィグレーション ソースへの移動」の説明

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

    図 14-2 プロセッサのコンフィグレーション ソースの編集

    図 14-2 の説明
    「図 14-2 プロセッサのコンフィグレーション ソースの編集」の説明

  3. クエリとビューを作成し、ユーザ定義の関数と枠を登録します。

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

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

14.2 クエリ

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

registerquery::=

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

注意 :

ここに示すのは、重要な最上位のクエリ構文です。この文の完全な構文とセマンティクスについては、「Query」を参照してください。

named_query 句自体は query 句で構成されます。

query::=

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

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

以下の節では、作成できる基本的なクエリの種類について説明しています。

14.2.1 クエリの構成要素

この節では、Oracle CQL クエリを作成する以下の基本的な構成要素の概要を示します。

14.2.1.1 Select、From、Where ブロック

sfw_block を使用して、Oracle CQL クエリの select、from、および省略可能な where 句を指定します。

sfw_block::=

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

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

14.2.1.2 Select 句

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

select_clause::=

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

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

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

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

14.2.1.3 From 句

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

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

from_clause::=

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

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

relation_variable::=

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

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

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

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

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

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

それ以外の場合、完全修飾されたストリーム要素名は省略可能です。ただし、Oracle ではストリーム名の参照を常に明示的に修飾することをお勧めします。完全修飾されたストリーム要素名によって、多くの場合 Oracle CEP での処理が軽減されます。

14.2.1.4 Where 句

select_clause で結果が返される条件を指定するには、この省略可能な句を使用します (節 14.2.1.2「Select 句」を参照)。

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

14.2.1.5 Group By 句

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

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

14.2.1.6 Order By 句

すべての結果または上位 n 個の結果を並べ替えるには、この省略可能な句を使用します。

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

14.2.1.7 Having 句

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

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

14.2.1.8 Binary 句

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

  • EXCEPT

  • MINUS

  • INTERSECT

  • UNIONUNION ALL

  • INNOT IN

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

14.2.1.9 Xstream 句

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

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

14.2.2 単純なクエリ

例 14-3 は、単一のストリームからすべてのストリーム要素を選択する単純なクエリを示します。

例 14-3 単純なクエリ

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

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

14.2.3 組み込み枠のクエリ

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

例 14-4 組み込み枠のクエリ

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

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

14.2.4 MATCH_RECOGNIZE のクエリ

例 14-5 は、ItemTempStream のストリーム要素間の複雑な関係を表す MATCH_RECOGNIZE 句を使用するクエリを示します。

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

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

14.2.5 XMLTable のクエリ

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

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

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

14.2.6 クエリ結果のソート

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

order_by_clause::=

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

(order_by_list::=)

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

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

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

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

14.3 ビュー

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

registerview::=

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

view_description::=

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

注意 :

ここに示すのは、重要な最上位のクエリ構文です。この文の完全な構文とセマンティクスについては、「View」を参照してください。

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

例 14-7 サブクエリの代わりとしてのビューの使用

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

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

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

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

<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 CEP での処理が軽減されます。

ビューの定義では任意の種類のクエリを指定できます。詳細については、節 14.2「クエリ」を参照してください。

14.4 結合

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

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

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

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

それ以外の場合、完全修飾されたストリーム要素名は省略可能です。ただし、Oracle ではストリーム名の参照を常に明示的に修飾することをお勧めします。完全修飾されたストリーム要素名によって、多くの場合 Oracle CEP での処理が軽減されます。

Oracle CEP では、以下の種類の結合がサポートされています。

14.4.1 内部結合

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

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

例 14-10 内部結合

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

14.4.2 外部結合

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

例 14-11 は、(+) 演算子を使用して、スキーマ (c1 integer, c2 float) を持つストリーム S0 とスキーマ (c1 integer, c2 float) を持つストリーム S1 の間の外部結合を使用するクエリ q5 を作成する方法を示します。

例 14-11 外部結合

<query id="q5"><![CDATA[ 
    select a.c1+b.c1 
    from 
        S0[range 5] as a, 
        S1[range 3] as b 
    where 
        b.c2 = a.c2(+)
]]></query>

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

Oracle CQL の外部結合の作成で従う必要のある制限については、節 14.4.2.3「外部結合の制限」を参照してください。

14.4.2.1 左外部結合

ストリーム A および B の外部結合を実行し、A のすべてのストリーム要素を返す (左外部結合の) クエリを作成するには、WHERE 句の結合条件で、B のすべてのストリーム要素に外部結合演算子 (+) を適用します。B に一致するストリーム要素がない A のすべてのストリーム要素については、Oracle CEP によって B のストリーム要素を含む select リスト式で null が返されます。

14.4.2.2 右外部結合

ストリーム A および B の外部結合を実行し、B のすべてのストリーム要素を返す (右外部結合の) クエリを作成するには、WHERE 句の結合条件で、A のすべての列に外部結合演算子 (+) を適用します。A に一致するストリーム要素がない B のすべてのストリーム要素については、Oracle CEP によって A のストリーム要素を含む select リスト式で null が返されます。

14.4.2.3 外部結合の制限

Oracle 結合演算子 (+) を使用する外部結合クエリでは、以下のルールと制限に従います。

  • (+) 演算子は WHERE 句でのみ使用し、ストリームまたはビューの要素にのみ適用できます。

  • 複数の結合条件によって A と B を結合する場合は、これらのすべての条件で (+) 演算子を使用する必要があります。これを行わない場合、Oracle CEP では単純結合で生成されたストリーム要素のみが返されますが、外部結合の結果でないことを示す警告やエラーは表示されません。

  • (+) 演算子はストリーム要素にのみ適用でき、任意の式には適用できません。ただし、(+) 演算子のマークが付けられた 1 つ以上のストリーム要素を任意の式で使用できます。

  • 自己結合は有効ですが、(+) 演算子を使用したストリーム自身への外部結合はできません。

    たとえば、以下の文は無効です。

    <query id="q1"><![CDATA[ 
        SELECT
            employee_id, 
            manager_id     FROM
            S0[range 5] as employees
        WHERE 
            employees.manager_id(+) = employees.employee_id
    ]]></query>
    

    ただし、以下の自己結合は有効です。

    <query id="q1"><![CDATA[ 
        SELECT 
            e1.employee_id, 
            e1.manager_id, 
            e2.employee_id    FROM 
            S0[range 5] as e1, 
            S0[range 5] as e2    WHERE 
            e1.manager_id(+) = e2.employee_id
    ]]></query>
    
  • OR 論理演算子を使用して (+) 演算子を含む WHERE 条件を他の条件と組み合わせることはできません。

  • WHERE 条件では、IN 比較条件を使用して (+) 演算子のマークが付けられたストリーム要素と式との比較を行うことはできません。

WHERE 句にストリーム B のストリーム要素と定数を比較する条件が含まれている場合は、Oracle CEP で null が生成されたストリーム要素に対してストリーム A のストリーム要素が返されるように、(+) 演算子をストリーム要素に適用する必要があります。そうしないと、Oracle CEP では単純結合の結果のみが返されます。

2 組を超えるストリームの外部結合を実行するクエリでは、他の 1 つのストリームに対して単一のストリームが null 生成されたストリームである場合があります。この理由により、A と B の結合条件および B と C の結合条件では B のストリーム要素に (+) 演算子を適用できません。

14.5 Oracle CQL クエリと Oracle CEP サーバ キャッシュ

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

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