Oracle CQL のクエリおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。
[REGISTER|CREATE] QUERY
文を使用して作成した最上位の SELECT
文はクエリと呼ばれます。
[REGISTER|CREATE] VIEW
文を使用して作成した最上位の VIEW 文はビューと呼ばれます (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 要素の子要素 rule
、view
、query
には各 Oracle CQL 文が含まれています。
rule
: ユーザ定義の枠を登録または作成する Oracle CQL 文が含まれています。rule
要素の id
属性は枠の名前と一致している必要があります。
例 14-1 では、rule
要素で range_slide
という名前のユーザ定義の枠を登録する Oracle CQL 文が指定されています。rule
要素の id
は枠の名前と一致している必要があります。
view
: Oracle CQL のビュー (Oracle CQL でのサブクエリ) の文が含まれています。view
要素の id
属性はビューの名前を定義します。
例 14-1 では、view
要素で Oracle CQL view
文 (Oracle CQL でのサブクエリ) が指定されています。
query
: Oracle CQL の select 文が含まれています。query
要素の id
属性はクエリの名前を定義します。
例 14-1 では、query
要素で Oracle CQL クエリ文が指定されています。クエリ文ではビューからの選択が行われます。デフォルトでは、クエリの結果が下流のチャネルに出力されます。チャネルのコンフィグレーションで selector
要素を使用して、この動作を制御できます。
詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CEP IDE for Eclipse を使用してデフォルトのコンポーネント コンフィグレーション ファイルでチャネルをコンフィグレーションする方法」を参照してください。
各 Oracle CQL 文は <![CDATA[
... ]]>
タグで囲み、末尾にセミコロン (;
) は付けません。
詳細については、以下を参照してください。
Oracle CQL クエリを作成するには :
Oracle CEP IDE for Eclipse を使用して、Oracle CEP アプリケーションとイベント処理ネットワーク (EPN) を作成します。
詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』を参照してください。
EPN エディタで Oracle CQL プロセッサを右クリックし、[Go to Configuration Source] を選択します (図 14-1 を参照)。
EPN エディタでこのプロセッサの対応するコンポーネント コンフィグレーション ファイルが開き、対応する processor
要素にカーソルが置かれます (図 14-2 を参照)。
クエリとビューを作成し、ユーザ定義の関数と枠を登録します。
例については、以下を参照してください。
Oracle CEP IDE for Eclipse を使用して、Oracle CEP アプリケーションをパッケージ化し、Oracle CEP サーバにデプロイします。
クエリとは、データ ストリームおよびビューからの情報を抽出する主な手段です。
named_query
句自体は query
句で構成されます。
query
句自体は、以下のいずれかの部分で構成されます。
sfw_block
: CQL クエリを表すには、この select-from-where 句を使用します。
詳細については、節 14.2.1.1「Select、From、Where ブロック」を参照してください。
binary
: 2 つのクエリまたはビューで返されるタプルの集合演算を実行するには、この句を使用します。
詳細については、節 14.2.1.8「Binary 句」を参照してください。
xstream_clause
: クエリに適用されるリレーションからストリームへの演算子を指定するには、この句を使用します。
詳細については、節 14.2.1.9「Xstream 句」を参照してください。
以下の節では、作成できる基本的なクエリの種類について説明しています。
この節では、Oracle CQL クエリを作成する以下の基本的な構成要素の概要を示します。
sfw_block
を使用して、Oracle CQL クエリの select、from、および省略可能な where 句を指定します。
sfw_block
は以下の部分で構成されます。
クエリの結果セットに必要なストリーム要素を指定するには、この句を使用します。select_clause
では *
演算子を使用してすべてのストリーム要素を指定するか、1 つ以上のストリーム要素のリストを指定できます。
SELECT
キーワードの後で、from_clause
の前に置かれた式のリストは select リストと呼ばれます。select リストでは、1 つ以上のストリームまたはビューから Oracle CEP によって返される要素のセットで 1 つ以上のストリーム要素を指定します。ストリーム要素の個数、データ型、および長さは select リストの要素によって決まります。
選択した重複タプルの各セットで 1 つのコピーのみが返されるようにするには、オプションで distinct
を指定します。重複タプルとは select リスト内の各式と一致する値を持つタプルです。
詳細については、select_clause::= を参照してください。
select_clause
で指定されたストリーム要素を提供するストリームおよびビューを指定するには、この句を使用します (節 14.2.1.2「Select 句」を参照)。
from_clause
では、1 つ以上のカンマ区切りの relation_variable
句を指定できます。
詳細については、from_clause::= を参照してください。
relation_variable
句で指定された任意のデータ ソースから選択できます。
relation_variable 句の AS 演算子でエリアスを定義して select リストの直前の式にラベルを付け、その名前で結果を参照できます (節 2.8.1「relation_variable 句のエリアス」を参照)。
共通するストリーム要素名を持つ複数のストリーム、ビュー、またはリレーションで結合を作成する場合は (節 14.4「結合」を参照)、各ストリーム、ビュー、またはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例 14-2 は、ストリーム名を使用して、OrderStream
の customerID
ストリーム要素と CustomerStream
の customerID
ストリーム要素を区別する方法を示します。
例 14-2 完全修飾されたストリーム要素名
<query id="q0"><![CDATA[ select * from OrderStream, CustomerStream where OrderStream.customerID = CustomerStream.customerID ]]></query>
それ以外の場合、完全修飾されたストリーム要素名は省略可能です。ただし、Oracle ではストリーム名の参照を常に明示的に修飾することをお勧めします。完全修飾されたストリーム要素名によって、多くの場合 Oracle CEP での処理が軽減されます。
select_clause
で結果が返される条件を指定するには、この省略可能な句を使用します (節 14.2.1.2「Select 句」を参照)。
詳細については、opt_where_clause::= を参照してください。
結果をグループ化 (分割) するには、この省略可能な句を使用します。この句では、結果セットの順序は保証されません。グループ化を並べ替えるには、order by 句を使用します。
詳細については、以下を参照してください。
すべての結果または上位 n
個の結果を並べ替えるには、この省略可能な句を使用します。
詳細については、以下を参照してください。
返されたストリーム要素のグループを指定された condition
が TRUE
のグループに制限するには、この省略可能な句を使用します。この句を省略すると、Oracle CEP ではすべてのグループのサマリ結果が返されます。
詳細については、opt_having_clause::= を参照してください。
2 つのクエリまたはビューで返されるタプルで以下の集合演算を実行するには、binary
句を使用します。
EXCEPT
MINUS
INTERSECT
UNION
と UNION ALL
IN
と NOT IN
詳細については、binary::= を参照してください。
select-from-where 句または binary 句を使用し、その結果を IStream、DStream、または Rstream のいずれかのリレーションからストリームへの演算子として返すには、この句を使用します。
詳細については、以下を参照してください。
例 14-3 は、単一のストリームからすべてのストリーム要素を選択する単純なクエリを示します。
例 14-3 単純なクエリ
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
詳細については、「Query」を参照してください。
例 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-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-6 は、ビュー v1
と、そのビューに対するクエリ q1
を示します。ビューは xmltype
ストリーム要素を持つストリーム S1
から選択します。ビュー v1
は XMLTABLE
句で 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-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「クエリ」を参照してください。
結合とは、複数のストリーム、ビュー、またはリレーションからの行を結合するクエリです。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 では、以下の種類の結合がサポートされています。
デフォルトでは、Oracle CEP は内部結合 (単純結合とも呼ばれる) を実行します。これは、複数のストリームから結合条件を満たすストリーム要素のみを返す結合です。
例 14-10 は、スキーマ (c1 integer, c2 float)
を持つストリーム S0
とスキーマ (c1 integer, c2 float)
を持つストリーム S1
の間の内部結合を使用するクエリ q4
を作成する方法を示します。
外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他のテーブルに結合条件を満たす行が含まれていなくてもテーブルの一部またはすべての行が返されます。
例 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「外部結合の制限」を参照してください。
ストリーム A および B の外部結合を実行し、A のすべてのストリーム要素を返す (左外部結合の) クエリを作成するには、WHERE
句の結合条件で、B のすべてのストリーム要素に外部結合演算子 (+)
を適用します。B に一致するストリーム要素がない A のすべてのストリーム要素については、Oracle CEP によって B のストリーム要素を含む select リスト式で null が返されます。
ストリーム A および B の外部結合を実行し、B のすべてのストリーム要素を返す (右外部結合の) クエリを作成するには、WHERE
句の結合条件で、A のすべての列に外部結合演算子 (+)
を適用します。A に一致するストリーム要素がない B のすべてのストリーム要素については、Oracle CEP によって A のストリーム要素を含む select リスト式で null が返されます。
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 のストリーム要素に (+) 演算子を適用できません。
Oracle CQL 文またはユーザ定義関数から Oracle CEP キャッシュにアクセスできます。
詳細については、以下を参照してください。
『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CEP キャッシングのコンフィグレーション」
『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CQL 文からキャッシュへのアクセス」
『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CQL ユーザ定義関数からキャッシュへのアクセス」