この章では、Oracle Continuous Query Language (Oracle CQL)の問合せ、ビューおよび結合のリファレンスと使用方法のガイドラインを提供します。 Oracle CQLの問合せおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。
QUERY
文を使用して作成した最上位のSELECT
文は問合せと呼ばれます。
VIEW
文を使用して作成した最上位のVIEW
文はビューと呼ばれます(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文が含まれています。
view
: Oracle CQLのビュー(Oracle CQLでの副問合せ)の文が含まれます。view
要素のid
属性はビューの名前を定義します。
例20-1では、view
要素でOracle CQL view
文(Oracle CQLでの副問合せ)が指定されています。
query
: Oracle CQLのselect文が含まれます。query
要素のid
属性は問合せの名前を定義します。
例20-1では、query
要素でOracle CQL問合せ文が指定されています。問合せ文ではビューからの選択が行われます。デフォルトでは、問合せの結果が下流のチャネルに出力されます。チャネルの構成でselector
要素を使用して、この動作を制御できます。
詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のチャネルの構成に関する項を参照してください。
各Oracle CQL文は<![CDATA[
... ]]>
タグで囲み、末尾にセミコロン(;)は付けません
。
詳細は、次を参照してください。
一般に、Oracle CQLの問合せおよびビューは、Oracle Event Processing IDE for Eclipseを使用して作成します。デプロイメント後に、Oracle Event Processing Visualizerを使用してOracle CQLの問合せを追加、変更および削除できます。
Oracle CQL問合せを作成するには:
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とイベント処理ネットワークに関する項
EPNエディタでOracle CQLプロセッサを右クリックし、「構成のソースに移動」を選択します(図20-1を参照)。
EPNエディタでこのプロセッサの対応するコンポーネント構成ファイルが開き、該当するprocessor
要素にカーソルが置かれます(図20-2を参照)。
問合せとビューを作成し、ユーザー定義の関数とウィンドウを登録します。
例については、次の項を参照してください。
『Oracle Fusion Middleware Oracle Event Processingスタート・ガイド』
Oracle Event Processing IDE for Eclipseを使用して、Oracle Event Processingアプリケーションをパッケージ化し、Oracle Event Processingサーバーにデプロイします。
詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processingアプリケーションのアセンブルとデプロイに関する項を参照してください。
デプロイメント後、Oracle Event Processing Visualizerを使用してOracle Event Processingアプリケーションを変更、追加および削除します。
詳細は、『Oracle Fusion Middleware Oracle Event Processing Visualizerユーザーズ・ガイド』のOracle CQLルールの管理に関する項を参照してください。
問合せは、データ・ストリームおよびビューからの情報を抽出する主な手段です。
query::=
query
句自体は、次のいずれかの部分で構成されます。
sfw_block
: CQL問合せを表すには、このselect-from-where句を使用します。
詳細は、20.2.1.1項「Select、From、Whereブロック」を参照してください。
idstream_clause
: 問合せに適用されるリレーションからストリームへの入力IStream
または削除DStream
演算子を指定するには、この句を使用します。
詳細は、20.2.1.9項「IDStream Clause句」を参照してください。
rstream
: 問合せに適用されるリレーションからストリームへのRStream
演算子を指定するには、この句を使用します。
詳細は、「リレーションからストリームへのRStream演算子」を参照してください。
binary
: 2つの問合せまたはビューで返されるタプルの集合演算を実行するには、この句を使用します。
詳細は、20.2.1.8項「Binary句」を参照してください。
次の項では、作成できる基本的な問合せの種類について説明しています。
詳細は、次を参照してください。
この項では、Oracle CQL問合せの作成に使用する基本的な構成要素について概説します。
sfw_block
を使用して、Oracle CQL問合せの select、from、およびオプションのwhere句を指定します。
sfw_block::=
sfw_block
は次の部分で構成されます。
問合せの結果セットに必要なストリーム要素を指定するには、この句を使用します。select_clause
では*
演算子を使用してすべてのストリーム要素を指定するか、1つ以上のストリーム要素のリストを指定できます。
select_clause::=
SELECT
キーワードの後で、from_clause
の前に置かれた式のリストはselectリストと呼ばれます。selectリストでは、1つ以上のストリームまたはビューからOracle Event Processingによって返される要素のセットで1つ以上のストリーム要素を指定します。ストリーム要素の個数、データ型および長さはselectリストの要素によって決まります。
選択した重複タプルの各セットで1つのコピーのみが返されるようにするには、オプションでdistinct
を指定します。重複タプルとはselectリスト内の各式と一致する値を持つタプルです。
詳細は、select_clause::=を参照してください。
select_clause
で指定されたストリーム要素を提供するストリームおよびビューを指定するには、この句を使用します(20.2.1.2項「Select句」を参照)。
from_clause
では、1つ以上のカンマ区切りのrelation_variable
句を指定できます。
from_clause::=
詳細は、from_clause::=を参照してください。
relation_variable::=
relation_variable
句で指定された任意のデータ・ソースから選択できます。
relation_variable
句のAS
演算子で別名を定義してselectリストの直前の式にラベルを付け、その名前で結果を参照できます(2.7.1.1項「relation_variable句の別名」を参照)。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーション間で結合を作成する場合は(20.4項「結合」を参照)、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例20-2は、ストリーム名を使用して、OrderStream
のcustomerID
ストリーム要素とCustomerStream
のcustomerID
ストリーム要素を区別する方法を示します。
例20-2 完全修飾されたストリーム要素名
<query id="q0"><![CDATA[ select * from OrderStream, CustomerStream where OrderStream.customerID = CustomerStream.customerID ]]></query>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle Event Processingでの処理が軽減されます。
詳細は、次を参照してください。
select_clause
で結果が返される条件を指定するには、このオプションの句を使用します(20.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 Event Processingではすべてのグループのサマリー結果が返されます。
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
を組み合せることで、問合せ結果の差分を簡単に検出できます。
詳細は、次を参照してください。
例20-3に、単一のストリームからすべてのストリーム要素を選択する単純な問合せを示します。
例20-3 単純な問合せ
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
詳細は、「Query」を参照してください。
例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-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>
詳細は、次を参照してください。
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。
詳細は、20.6項「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。
この問合せを使用して、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
から選択します。ビューv1
はXMLTABLE
句で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>
詳細は、次を参照してください。
TABLE
句を使用して、Oracle CQL問合せのFROM
句内の組込みまたはユーザー定義関数から返された複数の行にアクセスします。TABLE
句は返された複数の行をOracle CQLリレーションに変換します。これは外部リレーションであるため、TABLE
関数句とストリームを結合する必要があります。
table_clause::=
(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>
その他の例については、次の項を参照してください。
詳細は、次を参照してください。
Oracle CQLプロセッサを使用すると、キャッシュをイベント・ソースとして指定できます。Now
ウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。
Oracle Event Processingのキャッシュ・イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。
詳細は、20.5項「Oracle CQL問合せとOracle Event Processingサーバー・キャッシュ」を参照してください。
問合せで選択された行を並べ替えるには、ORDER
BY
句を使用します。
order_by_clause::=
次の場合は、位置によるソートが役立ちます。
selectリストの式が長い場合に並べ替えを行うには、式全体を繰り返すかわりにORDER
BY
句で位置を指定できます。
UNION
、INTERSECT
、MINUS
またはUNION
ALL
などの集合演算子を含む複合問合せの場合、ORDER
BY
句では明示的な式のかわりに位置または別名を指定する必要があります。また、ORDER
BY
句は最後のコンポーネント問合せでのみ使用できます。ORDER
BY
句は、複合問合せ全体で返されたすべての行の並べ替えを行います。
Oracle Event ProcessingでORDER
BY
句の値がソートされるメカニズムはJavaロケールで指定されます。
DIFFERENCE USING
句を使用すると、問合せのIStream
またはDStream
の差分を簡単に検出できます。
using_clause::=
例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への作用
入力 | リレーション | 出力 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
演算子の両方で使用できます。
詳細は、次を参照してください。
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つのパラメータが指定されます。
この項の内容は、次のとおりです。
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 Event Processingでは、queryId_paramIdという名前の新しい問合せが実行時に作成されます。たとえば例20-11に示すように、MarketRuleバインディングによってインスタンス化される最初の問合せの実行時の名前はMarketRule_nasORCL
になります。
実行時のネーミングの競合を回避するため、問合せのIDおよびパラメータIDの組合せが一意であることを確認してください。
各params
要素には、一意のid
、および対応する問合せ内のプレースホルダー文字(:
n
)の数と等しいパラメータ値のカンマ区切りのリストが含まれている必要があります。
表20-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 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
各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
CQLProcessorMBean.replaceAllBoundParameters()メソッドを使用して、パラメータ化された問合せ内のパラメータをプログラム的に置換する場合、メソッドによって置換されない既存のパラメータはすべて問合せから自動的に削除されます。
問合せは、データ・ストリームおよびリレーションからの情報を抽出する主な手段です。ビューは、ストリームまたはリレーションでの代替の選択項目を表し、副問合せの作成に使用できます。
ビューは、同じプロセッサにある問合せからのみアクセス可能で、この範囲を越えて公開することはできません。
ビューの定義で、任意の問合せタイプを指定できます。詳細は、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-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項「結合」を参照してください。
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。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では、次のタイプの結合をサポートします。
デフォルトでは、Oracle Event Processingは内部結合(単純結合とも呼ばれる)を実行します。これは、複数のストリームから結合条件を満たすストリーム要素のみを返す結合です。
例20-17は、スキーマ(c1 integer, c2 float)
を持つストリームS0
とスキーマ(c1 integer, c2 float)
を持つストリームS1
の間の内部結合を使用する問合せq4
を作成する方法を示します。
外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他の表に結合条件を満たす行が含まれていなくても表の一部またはすべての行が返されます。
外部結合は、LEFT
またはRIGHT OUTER JOIN ... ON
構文を使用して、問合せのFROM
で指定します。
from_clause::=
(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
句の検索条件またはフィルタ条件とは別個に結合条件を指定できます。
次の種類の外部結合を実行できます。
ストリームAおよびBの外部結合を実行し、Aのすべてのストリーム要素を返す(左外部結合の)問合せを作成するには、例20-19
に示すように、FROM
句でLEFT OUTER JOIN構文を使用します。Bに一致するストリーム要素がないAのすべてのストリーム要素については、Oracle Event ProcessingによってBのストリーム要素を含むselectリスト式でnullが返されます。
ストリームAおよびBの外部結合を実行し、Bのすべてのストリーム要素を返す(右外部結合の)問合せを作成するには、例20-20
に示すように、FROM
句でRIGHT OUTER JOIN構文を使用します。Aに一致するストリーム要素がないBのすべてのストリーム要素については、Oracle Event ProcessingによってAのストリーム要素を含むselectリスト式でnullが返されます。
前の外部結合を参照する、または見直す外部結合を作成できます(例20-21を参照)。
Oracle CQL文またはユーザー定義関数からOracle Event Processingキャッシュにアクセスできます。
この項の内容は、次のとおりです。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processingキャッシュの構成に関する項
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle CQL文からのキャッシュへのアクセスに関する項
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle CQLユーザー定義関数からのキャッシュへのアクセスに関する項
『Oracle Fusion Middleware Oracle Event Processingスタート・ガイド』のOracle Continuous Query Language (CQL)の例に関する項
キャッシュに対して結合を行うOracle CQL問合せを作成する場合、次の制限に従う必要があります。
詳細は、20.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データ・カートリッジを使用することを検討してください。 |
詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle CQLプロセッサの表ソースの構成に関する項を参照してください。
Oracle JDBCデータ・カートリッジ: Oracle JDBCデータ・カートリッジを使用して、任意の複雑なSQL問合せおよび複数の表とデータソースをOracle CQL問合せに統合できます。
詳細は、17.1項「Oracle Event Processing JDBCデータ・カートリッジについて」を参照してください。
注意: Oracle JDBCデータ・カートリッジを使用して、Oracle CQL文からリレーショナル・データベース表にアクセスすることをお薦めします。 |
いずれの場合でも、データソースはOracle Event Processing JDBCサーバーのconfig.xml
ファイルで定義する必要があります。詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のリレーショナル・データベースへのアクセスの構成に関する項を参照してください。
Oracle Event Processingのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。
Oracle CQL問合せ内のOracle CQLデータ・カートリッジ・タイプには、Oracle CQLネイティブ・タイプの場合と同様の方法でアクセスできます。
詳細は、次を参照してください。