Oracle CQLの問合せおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。
QUERY文を使用して作成した最上位のSELECT文は問合せと呼ばれます。
VIEW文を使用して作成した最上位のVIEW文はビューと呼ばれます(Oracle CQLでの副問合せ)。
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。
この章の内容は、次のとおりです。
詳細は、以下を参照してください。
Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリームまたはビューからのデータを取得するためにOracle CEP CQLプロセッサで実行される操作です。詳細は、18.2項「問合せ」を参照してください。
Oracle CQLビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQLでは、副問合せのかわりにビューを使用します。詳細は、18.3項「ビュー」を参照してください
Oracle CEPでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。詳細は、18.4項「結合」を参照してください。
例18-1は、procという名前のOracle CQLプロセッサ・コンポーネントの構成ファイルに定義された一般的なOracle CQL問合せを示します。
例18-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>
例18-1に示すように、rules要素の子要素viewまたはqueryには各Oracle CQL文が含まれています。
view: Oracle CQLのビュー(Oracle CQLでの副問合せ)の文が含まれます。view要素のid属性はビューの名前を定義します。
例18-1では、view要素で Oracle CQL view文(Oracle CQLでの副問合せ)が指定されています。
query: Oracle CQLのselect文が含まれます。query要素のid属性は問合せの名前を定義します。
例18-1では、query要素でOracle CQL問合せ文が指定されています。問合せ文ではビューからの選択が行われます。デフォルトでは、問合せの結果が下流のチャネルに出力されます。チャネルの構成でselector要素を使用して、この動作を制御できます。
詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのチャネルの構成に関する項を参照してください。
各Oracle CQL文は<![CDATA[ ... ]]>タグで囲み、末尾にセミコロン(;)は付けません。
詳細は、以下を参照してください。
一般に、Oracle CQLの問合せおよびビューは、Oracle CEP IDE for Eclipseを使用して作成します。デプロイメント後に、Oracle CEP Visualizerを使用してOracle CQLの問合せを追加、変更および削除できます。
Oracle CQL問合せを作成するには:
Oracle CEP IDE for Eclipseを使用して、Oracle CEPアプリケーションとイベント処理ネットワーク(EPN)を作成します。
詳細は、以下を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CEP IDE for Eclipseプロジェクトに関する項。
Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CEP IDE for Eclipseとイベント処理ネットワークに関する項。
EPNエディタでOracle CQLプロセッサを右クリックし、「構成のソースに移動」を選択します(図18-1を参照)。
EPNエディタでこのプロセッサの対応するコンポーネント構成ファイルが開き、該当するprocessor要素にカーソルが置かれます(図18-2を参照)。
問合せとビューを作成し、ユーザー定義の関数とウィンドウを登録します。
例については、次の項を参照してください。
『Oracle Complex Event Processingスタート・ガイド』
Oracle CEP IDE for Eclipseを使用して、Oracle CEPアプリケーションをパッケージ化し、Oracle CEPサーバーにデプロイします。
詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CEPアプリケーションのアセンブリおよびデプロイに関する項を参照してください。
デプロイメント後、Oracle CEP Visualizerを使用してOracle CEPアプリケーションで問合せを変更、追加および削除します。
詳細は、『Oracle Complex Event Processing Visualizerユーザーズ・ガイド』のOracle CQLルールの管理に関する項を参照してください。
問合せは、データ・ストリームおよびビューからの情報を抽出する主な手段です。

query句自体は、次のいずれかの部分で構成されます。
sfw_block: CQL問合せを表すには、このselect-from-where句を使用します。
詳細は、18.2.1.1項「Select、From、Whereブロック」を参照してください。
idstream_clause: 問合せに適用されるリレーションからストリームへの入力IStreamまたは削除DStream演算子を指定するには、この句を使用します。
詳細は、18.2.1.9項「IDStream Clause句」を参照してください。
rstream: 問合せに適用されるリレーションからストリームへのRStream演算子を指定するには、この句を使用します。
詳細は、「リレーションからストリームへのRStream演算子」を参照してください。
binary: 2つの問合せまたはビューで返されるタプルの集合演算を実行するには、この句を使用します。
詳細は、18.2.1.8項「Binary句」を参照してください。
次の項では、作成できる基本的な問合せの種類について説明しています。
詳細は、以下を参照してください。
この項では、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で指定されたストリーム要素を提供するストリームおよびビューを指定するには、この句を使用します(18.2.1.2項「Select句」を参照)。
from_clauseでは、1つ以上のカンマ区切りのrelation_variable句を指定できます。

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

relation_variable句で指定された任意のデータ・ソースから選択できます。
relation_variable句のAS演算子で別名を定義してselectリストの直前の式にラベルを付け、その名前で結果を参照できます(2.8.1.1項「relation_variable句の別名」を参照)。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーション間で結合を作成する場合は(18.4項「結合」を参照)、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例18-2は、ストリーム名を使用して、OrderStreamのcustomerIDストリーム要素とCustomerStreamのcustomerIDストリーム要素を区別する方法を示します。
例18-2 完全修飾されたストリーム要素名
<query id="q0"><![CDATA[
select * from OrderStream, CustomerStream
where
OrderStream.customerID = CustomerStream.customerID
]]></query>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle CEPでの処理が軽減されます。
詳細は、以下を参照してください。
select_clauseで結果が返される条件を指定するには、このオプションの句を使用します(18.2.1.2項「Select句」を参照)。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、以下を参照してください。
結果をグループ化(分割)するには、このオプションの句を使用します。この句では、結果セットの順序は保証されません。グループ化を並べ替えるには、order by句を使用します。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、以下を参照してください。
すべての結果または上位n個の結果を並べ替えるには、このオプションの句を使用します。
詳細は、以下を参照してください。
返されたストリーム要素のグループを指定されたconditionがTRUEのグループに制限するには、このオプションの句を使用します。この句を省略すると、Oracle CEPではすべてのグループのサマリ結果が返されます。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、以下を参照してください。
2つの問合せまたはビューで返されるタプルで次の集合演算を実行するには、binary句を使用します。
EXCEPT
MINUS
INTERSECT
UNIONとUNION ALL
INとNOT IN
詳細は、binary::=を参照してください。
select-from-where句またはbinary句を使用し、その結果をIStreamまたはDStreamのいずれかのリレーションからストリームへの演算子として返すには、この句を使用します。
IStreamまたはDstream演算子とusing_clauseを組み合せることで、問合せ結果の差分を簡単に検出できます。
詳細は、以下を参照してください。
例18-3に、単一のストリームからすべてのストリーム要素を選択する単純な問合せを示します。
例18-3 単純な問合せ
<query id="q0"><![CDATA[
select * from OrderStream where orderAmount > 10000.0
]]></query>
詳細は、「Query」を参照してください。
例18-4に、組込みのタプルベースのストリームからリレーションへのウィンドウ演算子を使用して、スキーマ(c1 integer, c2 float)を持つストリームS2からすべてのストリーム要素を選択する問合せを示します。
例18-4 組込みウィンドウの問合せ
<query id="BBAQuery"><![CDATA[
select * from S2 [range 5 minutes] where S2.c1 > 10
]]></query>
詳細は、以下を参照してください。
例18-5に、ItemTempStreamのストリーム要素間の複雑な関係を表すMATCH_RECOGNIZE句を使用する問合せを示します。
例18-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>
詳細は、以下を参照してください。
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。
詳細は、18.6項「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。
例18-6は、ビューv1と、そのビューに対する問合せq1を示します。ビューはxmltypeストリーム要素を持つストリームS1から選択します。ビューv1はXMLTABLE句でXPath式を使用して、xmltypeストリーム要素のデータを解析します。ビューのスキーマのデータ型は、COLUMNS句で解析されたデータのデータ型と一致します。問合せq1は他の任意のデータ・ソースの場合と同様に、このビューから選択します。XMLTABLE句はXMLネームスペースもサポートしています。
例18-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>
詳細は、以下を参照してください。
TABLE句を使用して、Oracle CQL問合せのFROM句内の組込みまたはユーザー定義関数から返された複数の行にアクセスします。TABLE句は返された複数の行をOracle CQLリレーションに変換します。これは外部リレーションであるため、TABLE句をストリームと結合する必要があります。

(object_expr::=、identifier::=、datatype::=)
次の点に注意してください。
関数は、配列型またはCollection型を返す必要があります。
TABLE関数の句とストリームを結合する必要があります。
例18-7は、1つのパラメータ(InputPoints.point)を渡して、Oracle SpatialメソッドgetContainingGeometriesを呼び出すデータ・カートリッジTABLE句を示しています。このメソッドの戻り値Collectionには別名validGeometriesが作成されます。TABLE句が戻すリレーションには別名R2が作成されます。
例18-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>
例18-8に、パラメータを指定せずに関数getAllGeometries@spatialを呼び出したために、データ・カートリッジTABLE句と別のストリームとの結合に失敗した、無効なデータ・カートリッジTABLEの問合せを示します。Oracle CEPでは、結合ストリームに要素が到着したときにのみデータ・カートリッジ・メソッドを呼び出します。
例18-8 無効なデータ・カートリッジTABLEの問合せ
<query id="q2"><![CDATA[
RSTREAM (
SELECT
R2.validGeometries.shape as containingGeometry
FROM
TABLE (getAllGeometries@spatial () as validGeometries) AS R2
)
]]></query>
その他の例については、次の項を参照してください。
詳細は、以下を参照してください。
Oracle CQLプロセッサを使用すると、キャッシュをイベント・ソースとして指定できます。Nowウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。
Oracle CEPのキャッシュ・イベント・ソースはプル・データ・ソースです。つまり、Oracle CEPは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。
詳細は、18.5項「Oracle CQL問合せとOracle CEPサーバー・キャッシュ」を参照してください。
問合せで選択された行を並べ替えるには、ORDER BY句を使用します。

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

例18-9のような問合せがあるとします。
例18-9 DIFFERENCE USING句
<query id="q0">
ISTREAM (
SELECT c1 FROM S [RANGE 1 NANOSECONDS]
) DIFFERENCE USING (c1)
</query>
表18-1に、この問合せのサンプル入力を示します。リレーション列にはリレーションS [RANGE 1 NANOSECONDS]の内容を示し、出力列にはDIFFERENCE USINGを適用後の問合せ結果を示します。この句を使用すると、IStream出力の差分のみを簡単に検出できます。
表18-1 DIFFERENCE USING句のIStreamへの作用
| 入力 | リレーション | 出力 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DIFFERENCE USING句でusinglistを指定する場合、次の項目で列を指定できます。
属性名: 属性名で選択する場合に、このオプションを使用します。
例18-10は、DIFFERENCE USING句のusinglistの属性名c1を示しています。
別名: 別名が指定されている式の結果を含める場合に、このオプションを使用します。
例18-10は、DIFFERENCE USING句のusinglistの別名logvalを示しています。
位置: 別名が指定されていない式の結果を含める場合に、このオプションを使用します。
位置は、左から右に読み取る、1で始まる正の整数の、定数として指定します。
例18-10では、位置(3)によって、DIFFERENCE USING句のusinglistの式の結果funct(c2, c3)を示しています。
例18-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演算子の両方で使用できます。
詳細は、以下を参照してください。
Oracle CQL問合せをパラメータ化し、:n文字列をプレースホルダとして使用して、実行時にパラメータ値をバインドできます。ここで、nは、params要素内の置換値の位置に相当する正の整数です。
例18-11に、パラメータ化されたOracle CQL問合せを示します。
例18-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つのパラメータが指定されます。
この項の内容は、次のとおりです。
数式内の任意の場所またはOracle CQL文でStringリテラルが有効な場合に、プレースホルダを指定できます。たとえば、次のようになります。
SELECTリストの項目
WHERE句の記述
WINDOWコンストラクト(RANGE、SLIDE、ROWSおよびPARTITION BYなど)
PATTERN期間句
詳細は、以下を参照してください。
パラメータ値は、bindings要素によって包含されます。processorごとに1つのbindings要素がある場合があります。
各パラメータ化された問合せについて、bindings要素に、問合せと同じidのbinding要素が含まれている必要があります。
binding要素には、1つ以上のparams要素が含まれている必要があります。各params要素には、一意のid、および対応する問合せ内のプレースホルダ文字(:n)の数と等しいパラメータ値のカンマ区切りのリストが含まれている必要があります。
パラメータ値の順序は、:1は最初のパラメータ値、:2は2番目のパラメータ値などというように、パラメータ化された問合せ内のプレースホルダ文字(:n)に相当します。プレースホルダ文字(:n)は任意の順序で使用できます。つまり、:1は、問合せ内で:2の前か後の最初のパラメータ値に相当します。1つのプレースホルダの番号は問合せ内で1回のみ使用できます。
詳細は、以下を参照してください。
バインディングによってパラメータ化された問合せがインスタンス化される際、Oracle CEPでは、queryId_paramIdという名前の問合せが実行時に作成されます。たとえば例18-11に示すように、MarketRuleバインディングによってインスタンス化される最初の問合せの実行時の名前はMarketRule_nasORCLになります。
実行時のネーミングの競合を回避するため、問合せのIDおよびパラメータIDの組合せが一意であることを確認してください。
params要素には、一意のid、および対応する問合せ内のプレースホルダ文字(:n)の数と等しいパラメータ値のカンマ区切りのリストが含まれている必要があります。
表18-2 パラメータ化された問合せのパラメータ値の表記規則
| 規則 | 例 | 置換値 |
|---|---|---|
|
プリミティブ・タイプ・リテラル |
<params id="p1">NASDAQ, 200.0</params> |
|
|
Oracle CQLフラグメント |
<params id="p1">count(*), |
|
|
引用符 |
<params id="p1"> |
|
Oracle CQL問合せでは、一重または二重引用符内のプレースホルダはStringリテラルです。次の問合せはパラメータ化された問合せではありません。
SELECT ":1" as symbol, price FROM StockTick [RANGE 5 SECONDS]
Oracle CEPでは、この問合せは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
各params要素により、新しいパラメータを使用して新しいOracle CQL問合せが効率的に実行されます。ルールの実行時に、Oracle CQLはパラメータ値を左から右に向かってプレースホルダ文字に置換します。例18-11は、例18-12で示されている問合せと効率よく同等になっています。
例18-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
CQLProcessorMBean.replaceAllBoundParameters()メソッドを使用して、パラメータ化された問合せ内のパラメータをプログラム的に置換する場合、メソッドによって置換されない既存のパラメータはすべて問合せから自動的に削除されます。
問合せは、データ・ストリームおよびリレーションからの情報を抽出する主な手段です。ビューは、ストリームまたはリレーションでの代替の選択項目を表し、副問合せの作成に使用できます。
ビューは、同じプロセッサにある問合せからのみアクセス可能で、この範囲を越えて公開することはできません。
ビューの定義で、任意の問合せタイプを指定できます。詳細は、18.2項「問合せ」を参照してください。
view文の詳細は、「View」を参照してください。
例18-13では、問合せBBAQueryはビューMAXBIDMINASKからの選択を行い、このビューはBIDMAXなどの他のビューからの選択を行い、それらのビューはさらに他のビューからの選択を行います。最終的に、lastEventsなどのビューが実際のイベント・ソースであるfilteredStreamからの選択を行います。これらの各ビューは、1つ以上の基本ストリームから派生した個別のストリームを表しています。
例18-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>
この方法を使用して、副問合せと同様の結果を得ることができます。ただし、ビューを使用することで、問合せの複雑さをより柔軟に制御でき、名前によって他の問合せでビューを再利用できます。
共通するストリーム要素名を持つ複数のビューで結合を作成する場合は、ストリームの名前を使用してストリーム要素名を修飾する必要があります。例18-14は、ビュー名を使用して、BIDMAXビューのseqストリーム要素とASKMINビューのseqストリーム要素を区別する方法を示します。
例18-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 CEPでの処理が軽減されます。
詳細は、18.4項「結合」を参照してください。
結合とは、複数のストリーム、ビューまたはリレーションからの行を結合する問合せです。Oracle CEPでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。問合せのselectリストでは、それらの任意のストリームから任意のストリーム要素を選択できます。いずれか2つのストリームで共通するストリーム要素名がある場合は、ストリーム名を使用して、問合せ全体を通じてそれらのストリーム要素に対するすべての参照を修飾し、曖昧さを避ける必要があります。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーションで結合を作成する場合は、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例18-16は、ストリーム名を使用して、OrderStreamストリームのcustomerIDストリーム要素と CustomerStreamストリームのcustomerIDストリーム要素を区別する方法を示します。
例18-16 完全修飾されたストリーム要素名
<query id="q0"><![CDATA[
select * from OrderStream[range 5] as orders, CustomerStream[range 3] as customers where
orders.customerID = customers.customerID
]]></query>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle CEPでの処理が軽減されます。
Oracle CEPでは、次の種類の結合がサポートされています。
デフォルトでは、Oracle CEPは内部結合(単純結合とも呼ばれる)を実行します。これは、複数のストリームから結合条件を満たすストリーム要素のみを返す結合です。
例18-17は、スキーマ(c1 integer, c2 float)を持つストリームS0とスキーマ(c1 integer, c2 float)を持つストリームS1の間の内部結合を使用する問合せq4を作成する方法を示します。
外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他の表に結合条件を満たす行が含まれていなくても表の一部またはすべての行が返されます。
外部結合は、LEFTまたはRIGHT OUTER JOIN ... ON構文を使用して、問合せのFROMで指定します。

(non_mt_relation_list::=、relation_variable::=、non_mt_cond_list::=)
例18-18は、スキーマ(c1 integer, c2 float)を持つストリームS0とスキーマ(c1 integer, c2 float)を持つストリームS1の間の左外部結合を使用する問合せq5を作成する方法を示します。
例18-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句の検索条件またはフィルタ条件とは別個に結合条件を指定できます。
次の種類の外部結合を実行できます。
ストリームAおよびBの外部結合を実行し、Aのすべてのストリーム要素を返す(左外部結合の)問合せを作成するには、例18-19に示すように、FROM句でLEFT OUTER JOIN構文を使用します。Bに一致するストリーム要素がないAのすべてのストリーム要素については、Oracle CEPによってBのストリーム要素を含むselectリスト式でnullが返されます。
ストリームAおよびBの外部結合を実行し、Bのすべてのストリーム要素を返す(右外部結合の)問合せを作成するには、例18-20に示すように、FROM句でRIGHT OUTER JOIN構文を使用します。Aに一致するストリーム要素がないBのすべてのストリーム要素については、Oracle CEPによってAのストリーム要素を含むselectリスト式でnullが返されます。
前の外部結合を参照する、または見直す外部結合を作成できます(例18-21を参照)。
Oracle CQL文またはユーザー定義関数からOracle CEPキャッシュにアクセスできます。
この項の内容は、次のとおりです。
詳細は、以下を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイドのキャッシュの構成に関する項
Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CQL文からのキャッシュへのアクセスに関する項
Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CQLユーザー定義関数からのキャッシュへのアクセスに関する項
『Oracle Complex Event Processingスタート・ガイド』のOracle Continuous Query Language(CQL)の例に関する項
キャッシュに対して結合を行うOracle CQL問合せを作成する場合、次の制限に従う必要があります。
詳細は、18.4項「結合」を参照してください。
キャッシュ・キー属性に対する比較演算を持つ複合述語の(左から)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 ...
副句で、キャッシュ・キー属性に対する算術演算は使用できません。
キャッシュ・キー属性では算術演算を使用できないため、次の述語は無効です。
... CACHE.C1 + 5 = S.C1 AND CACHE.C2 = S.C2 ...
複合述語で、キャッシュの全体スキャンは使用できません。
キャッシュのキャッシュ・キーが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 ...
リレーショナル・データベース表には、次を使用してOracle CQL問合せからアクセスできます。
表ソース: 表ソースを使用して、NOWウィンドウのあるストリームのみを単一のデータベース表のみに結合できます。
|
注意: 表ソースの変更とストリーム・データはすぐには連係されないため、表ソースはNowウィンドウを使用してイベント・ストリームにのみ結合でき、また単一のデータベース表にのみ結合できます。詳細は、「S[now]「を参照してください。
任意の複雑なSQL問合せおよび複数の表をOracle CQL問合せに統合する場合は、かわりにOracle JDBCデータ・カートリッジを使用することを検討してください。 |
詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CQLプロセッサ表ソースの構成に関する項を参照してください。
Oracle JDBCデータ・カートリッジ: Oracle JDBCデータ・カートリッジを使用して、任意の複雑なSQL問合せおよび複数の表とデータソースをOracle CQL問合せに統合できます。
詳細は、17.1項「Oracle CEP JDBCデータ・カートリッジについて」を参照してください。
|
注意: Oracle JDBCデータ・カートリッジを使用して、Oracle CQL文からリレーショナル・データベース表にアクセスすることをお薦めします。 |
いずれの場合でも、データソースはOracle CEPサーバーconfig.xmlファイルで定義する必要があります。詳細は、『Oracle Complex Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。
Oracle CEPのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle CEPは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。