| Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス 12c リリース(12.1.3) E57533-04 |
|
![]() 前へ |
![]() 次へ |
この章では、Oracle Continuous Query Language (Oracle CQL)の問合せ、ビューおよび結合のリファレンスと使用方法のガイドラインを提供します。 Oracle CQLの問合せおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。
QUERY文を使用して作成した最上位のSELECT文は問合せと呼ばれます。
副問合せは、ビューのメカニズムによって別の問合せのなかにネストされたまたは組み込まれた問合せです。
VIEW文を使用して作成した最上位のVIEW文はビューと呼ばれます。
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。
この章の内容は次のとおりです。
詳細は、次を参照してください。
Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリームまたはビューからデータを取得するために、Oracle Event Processing CQLプロセッサで実行される操作です。詳細は、「問合せ」を参照してください。
Oracleの副問合せは、ビューのメカニズムによって別の問合せのなかにネストされたまたは組み込まれた問合せです。詳細は、「ビュー」を参照してください。
Oracle CQLのビューは、ストリームまたはリレーションに関する代替の選択を表します。詳細は、「ビュー」を参照してください。
Oracle Event Processingでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。詳細は、「結合」を参照してください。
次の例は、procという名前のプロセッサのOracle CQLプロセッサ・コンポーネント構成ファイルに定義された一般的な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>
次の例に示すように、rules要素の子要素viewまたはqueryには各Oracle CQL文が含まれています。
rule: ユーザー定義ウィンドウを登録または作成するOracle CQL文を含みます。rule要素id属性はウィンドウの名前と一致する必要があります。
rule要素でrange_slideという名前のユーザー定義ウィンドウを登録するOracle CQL文が指定されています。rule要素idはウィンドウの名前と一致する必要があります。
view: Oracle CQL view文(Oracle CQLで副問合せに相当するもの)を含みます。view要素のid属性はビューの名前を定義します。
view要素でOracle CQL view文(Oracle CQLでの副問合せ)が指定されています。
query: Oracle CQL select文を含みます。query要素のid属性は問合せの名前を定義します。
query要素でOracle CQL問合せ文が指定されています。問合せq1は、ビューlastEventsから選択します。デフォルトでは、問合せの結果はダウンストリーム・チャネルに出力されます。selector要素を使用して、チャネル構成でこの動作を制御できます。
各Oracle CQL文は<![CDATA[ ... ]]>タグで囲み、末尾にセミコロン(;)は付けません。
詳細は、次を参照してください。
問合せは、データ・ストリームおよびビューからの情報を抽出する主な手段です。
query::=

query句自体は、次のいずれかの部分で構成されます。
sfw_block: CQL問合せを表すには、このselect-from-where句を使用します。
詳細は、「Select、From、Whereブロック」を参照してください。
idstream_clause: 問合せに適用されるリレーションからストリームへの入力IStreamまたは削除DStream演算子を指定するには、この句を使用します。
詳細は、「IDStream句」を参照してください。
rstream: 問合せに適用されるリレーションからストリームへのRStream演算子を指定するには、この句を使用します。
詳細は、「リレーションからストリームへのRStream演算子」を参照してください。
binary: 2つの問合せまたはビューで返されるタプルの集合演算を実行するには、この句を使用します。
詳細は、「Binary句」を参照してください。
次の項では、作成できる基本的な問合せの種類について説明しています。
詳細は、次を参照してください。
この項では、Oracle CQL問合せの作成に使用する基本的な構成要素について概説します。
問合せの結果セットに必要なストリーム要素を指定するには、この句を使用します。select_clauseでは*演算子を使用してすべてのストリーム要素を指定するか、1つ以上のストリーム要素のリストを指定できます。
select_clause::=

SELECTキーワードの後で、from_clauseの前に置かれた式のリストはselectリストと呼ばれます。selectリストでは、1つ以上のストリームまたはビューからOracle Event Processingによって返される要素のセットに含まれるようにする1つ以上のストリーム要素を指定します。ストリーム要素の個数、データ型および長さはselectリストの要素によって決まります。
選択した重複タプルの各セットで1つのコピーのみがOracle Event Processingから返されるようにするには、オプションでdistinctを指定します。重複タプルとはselectリスト内の各式と一致する値を持つタプルです。
詳細については、「図16-3」を参照してください。
select_clauseで指定されたストリーム要素を提供するストリームおよびビューを指定するには、この句を使用します(「Select句」を参照)。
from_clauseでは、1つ以上のカンマ区切りのrelation_variable句を指定できます。
from_clause::=

relation_variable::=

relation_variable句で指定された任意のデータ・ソースから選択できます。
relation_variable句のAS演算子で別名を定義してselectリストの直前の式にラベルを付け、その名前で結果を参照できます(「relation_variable句の別名」を参照)。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーション間で結合を作成する場合は(「結合」を参照)、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。次の例は、ストリーム名を使用して、OrderStreamのcustomerIDストリーム要素とCustomerStreamのcustomerIDストリーム要素を区別する方法を示します。
<query id="q0"><![CDATA[ select * from OrderStream, CustomerStream where OrderStream.customerID = CustomerStream.customerID ]]></query>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle Event Processingでの処理が軽減されます。
詳細は、次を参照してください。
select_clauseで結果が返される条件を指定するには、このオプションの句を使用します(「Select句」を参照)。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、次を参照してください。
結果をグループ化(分割)するには、このオプションの句を使用します。この句では、結果セットの順序は保証されません。グループ化を並べ替えるには、order by句を使用します。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、次を参照してください。
返されたストリーム要素のグループを指定された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
次の例に、単一のストリームからすべてのストリーム要素を選択する単純な問合せを示します。
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
詳細は、問合せを参照してください。
次の例に、組込みのタプルベースのストリームからリレーションへのウィンドウ演算子を使用して、スキーマ(c1 integer, c2 float)を持つストリームS2からすべてのストリーム要素を選択する問合せを示します。
tkdata2.cqlx
<query id="BBAQuery"><![CDATA[ select * from S2 [range 5 minutes] where S2.c1 > 10 ]]></query>
詳細は、次を参照してください。
次の例に、ユーザー定義JavaクラスMyRangeSlideWindow.javaに基づくタイプrange_slideのユーザー定義ウィンドウを使用して、スキーマ(c1 integer, c2 float)を持つストリームS12からすべてのストリーム要素を選択する問合せを示します。
<rule id="range_slide"><![CDATA[ register window range_slide(winrange int, winslide int) implement using "MyRangeSlideWindow" ]]></rule> <query id="q79"><![CDATA[ select * from S12 [range_slide(10,5)] ]]></query>
詳細は、「ユーザー定義のストリームからリレーションへのウィンドウ演算子」を参照してください。
次の例に、ItemTempStreamのストリーム要素間の複雑な関係を表す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プロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。
詳細は、「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。
この問合せを使用して、XPathまたはXQuery式の結果をタプルにマップします。
XMLTABLEには次の副句があります。
XMLNAMESPACES: オプション。問合せの式で使用できる一連のXMLネームスペースの宣言を持つ文字列。
XQuery_string: XMLの問合せに使用するためのXQueryまたはXPath文字列を持つ文字列。
PASSING BY VALUE: 入力に使用されるXMLを指します。
COLUMNS: オプション。結果の出力プロパティを定義します。
PATH: オプション。そのプロパティの値をXMLから取得する場所を指すXPath式を指定するCOLUMNSの副句。
次の例は、ビューv1、およびそのビューに対する問合せq1を示します。ビューはxmltypeストリーム要素を持つストリームS1から選択します。ビューv1はXMLTABLE句でXPath式を使用して、xmltypeストリーム要素のデータを解析します。ビューのスキーマのデータ型は、COLUMNS句で解析されたデータのデータ型と一致することに注意してください。問合せq1は他の任意のデータ・ソースの場合と同様に、このビューから選択します。XMLTABLE句はXMLネームスペースもサポートしています。
<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関数句とストリームを結合する必要があります。
次の例は、1つのパラメータ(InputPoints.point)を渡して、Oracle SpatialメソッドgetContainingGeometriesを呼び出すデータ・カートリッジTABLE句を示しています。このメソッドの戻り値Collectionには別名validGeometriesが作成されます。TABLE句が戻すリレーションには別名R2が作成されます。
<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>
次の例に、パラメータを指定せずに関数getAllGeometries@spatialを呼び出したために、データ・カートリッジTABLE句と別のストリームとの結合に失敗した、無効なデータ・カートリッジTABLEの問合せを示します。Oracle Event Processingでは、結合ストリームに要素が到着したときにのみデータ・カートリッジ・メソッドを呼び出します。
<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は、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。
詳細は、「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::=

次の問合せについて考えてみます。
<query id="q0"> ISTREAM ( SELECT c1 FROM S [RANGE 1 NANOSECONDS] ) DIFFERENCE USING (c1) </query>
表14-1に、この問合せのサンプル入力を示します。リレーション列にはリレーションS [RANGE 1 NANOSECONDS]の内容を示し、出力列にはDIFFERENCE USINGを適用後の問合せ結果を示します。この句を使用すると、IStream出力の差分のみを簡単に検出できます。
|
表14-1 DIFFERENCE USING句のIStreamへの作用
|
DIFFERENCE USING句でusinglistを指定する場合、次の項目で列を指定できます。
属性名: 属性名で選択する場合に、このオプションを使用します。
別名: 別名が指定されている式の結果を含める場合に、このオプションを使用します。
位置: 別名が指定されていない式の結果を含める場合に、このオプションを使用します。
位置は、左から右に読み取る、1で始まる正の整数の、定数として指定します。
次の例では、式funct(c2, c3)の結果を、DIFFERENCE USING句のusinglistで位置(3)によって示しています。
<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要素内の置換値の位置に相当する正の整数です。
注意:
ビューをパラメータ化することはできません。
次の例に、パラメータ化された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要素パラメータ値は、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という名前の新しい問合せが実行時に作成されます。たとえば、MarketRuleバインディングによってインスタンス化される最初の問合せの実行時の名前はMarketRule_nasORCLになります。
実行時のネーミングの競合を回避するため、問合せのIDおよびパラメータIDの組合せが一意であることを確認してください。
各params要素には、一意のid、および対応する問合せ内のプレースホルダー文字(:n)の数と等しいパラメータ値のカンマ区切りのリストが含まれている必要があります。
|
表14-2 パラメータ化された問合せのパラメータ値の表記規則
|
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はパラメータ値を左から右に向かってプレースホルダー文字に置換します。
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
JMXまたはwlevs.Adminを使用することで、params要素のid属性で設定した1つのパラメータを動的に変更または削除できます。
問合せは、データ・ストリームおよびリレーションからの情報を抽出する主な手段です。ビューは、ストリームまたはリレーションでの代替の選択項目を表し、副問合せの作成に使用できます。
ビューは、同じプロセッサにある問合せからのみアクセス可能で、この範囲を越えて公開することはできません。
ビューの定義で、任意の問合せタイプを指定できます。詳細は、「問合せ」を参照してください。
view文の詳細は、「ビュー」を参照してください。
注意:
副問合せは、UNION、UNION ALLおよびMINUSなどのバイナリ・セット演算子とともに使用されます。副問合せでは、問合せに正しい優先順位が適用されるようカッコを使用します。
問合せBBAQueryはビューMAXBIDMINASKからの選択を行い、このビューはBIDMAXなどの他のビューからの選択を行い、それらのビューはさらに他のビューからの選択を行います。最終的に、lastEventsなどのビューが実際のイベント・ソースであるfilteredStreamからの選択を行います。これらの各ビューは、1つ以上の基本ストリームから派生した個別のストリームを表しています。
<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>
この方法を使用して、副問合せと同様の結果を得ることができます。ただし、ビューを使用することで、問合せの複雑さをより柔軟に制御でき、名前によって他の問合せでビューを再利用できます。
共通するストリーム要素名を持つ複数のビューで結合を作成する場合は、ストリームの名前を使用してストリーム要素名を修飾する必要があります。次の例は、ビュー名を使用して、BIDMAXビューのseqストリーム要素とASKMINビューのseqストリーム要素を区別する方法を示します。
<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での処理が軽減されます。
詳細は、「結合」を参照してください。
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。Oracle Event Processingでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。問合せのselectリストでは、それらの任意のストリームから任意のストリーム要素を選択できます。いずれか2つのストリームで共通するストリーム要素名がある場合は、ストリーム名を使用して、問合せ全体を通じてそれらのストリーム要素に対するすべての参照を修飾し、曖昧さを避ける必要があります。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーションで結合を作成する場合は、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。次の例は、ストリーム名を使用して、OrderStreamストリームのcustomerIDストリーム要素と CustomerStreamストリームのcustomerIDストリーム要素を区別する方法を示します。
<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は内部結合(単純結合とも呼ばれる)を実行します。これは、複数のストリームから結合条件を満たすストリーム要素のみを返す結合です。
次の例は、スキーマ(c1 integer, c2 float)を持つストリームS0とスキーマ(c1 integer, c2 float)を持つストリームS1の間の内部結合を使用する問合せq4を作成する方法を示します。
<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>
外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他の表に結合条件を満たす行が含まれていなくても表の一部またはすべての行が返されます。
外部結合は、LEFTまたはRIGHT OUTER JOIN ... ON構文を使用して、問合せのFROMで指定します。
from_clause::=

次の例は、スキーマ(c1 integer, c2 float)を持つストリームS0と、スキーマ(c1 integer, c2 float)を持つストリームS1の間で、左外部結合を使用する問合せq5を作成する方法を示します。
<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のすべてのストリーム要素を返す(左外部結合の)問合せを作成するには、FROM句でLEFT OUTER JOIN構文を使用します。Bに一致するストリーム要素がないAのすべてのストリーム要素については、Oracle Event ProcessingによってBのストリーム要素を含むselectリスト式でnullが返されます。
<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>
ストリームAおよびBの外部結合を実行し、Bのすべてのストリーム要素を返す(右外部結合の)問合せを作成するには、FROM句でRIGHT OUTER JOIN 構文を使用します。Aに一致するストリーム要素がないBのすべてのストリーム要素については、Oracle Event ProcessingによってAのストリーム要素を含むselectリスト式でnullが返されます。
<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>
キャッシュに対して結合を行うOracle CQL問合せを作成する場合、次の制限に従う必要があります。
詳細は、「結合」を参照してください。
キャッシュ・キー属性に対する比較演算を持つ複合述語の(左から)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問合せからリレーショナル・データベース表にアクセスできます。
表ソース: 表ソースを使用して、ストリームを「即時」ウィンドウのみ、かつ単一のデータベース表に対してのみ結合できます。
注意:
表ソースの変更が、ストリーム・データと適宜調整されないため、表ソースを「即時」ウィンドウを使用してイベント・ストリームにのみ結合でき、かつ単一のデータベース表のみ結合できる場合があります。詳細は、「S[now]」を参照してください。
任意の複雑なSQL問合せおよび複数の表を自分のOracle SQL問合せと統合するには、かわりにOracle JDBCデータ・カートリッジの使用を検討してください。
Oracle JDBCデータ・カートリッジ: Oracle JDBCデータ・カートリッジを使用して、任意の複雑なSQL問合せおよび複数の表、データソースを自分のOracle CQL問合せと結合する場合があります。
注意:
XMLTYPEは表ソースでサポートされません。
いずれの場合でも、データソースはOracle Event Processingサーバーのconfig.xmlファイルで定義する必要があります。
Oracle Event Processingのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。