プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス
12c リリース(12.1.3)
E57533-04
目次へ移動
目次

前
前へ

16 Oracle CQL文

この章では、Oracle Continuous Query Language (Oracle CQL)のデータ定義言語(DDL)文について説明します。

この章の内容は次のとおりです。

16.1 Oracle CQL文の概要

Oracle CQLでは次のDDL文をサポートしています。

注意:

ストリーム入力の例で、hで始まる行(h 3800など)はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことをOracle Event Processingに通知します。

詳細は、次を参照してください。

16.2 問合せ

目的

後続のOracle CQL文のidentifierで参照されるOracle CQL問合せを定義するには、query文を使用します。

前提条件

問合せがストリームまたはビューを参照する場合は、ストリームまたはビューが存在している必要があります。

問合せがすでに存在する場合は、Oracle Event Processingサーバーで例外がスローされます。

詳細は、次を参照してください。

構文

<query></query>要素で問合せを表します。

query要素は1つの属性を持ちます。

  • id: query要素のid属性としてidentifierを指定します。

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

図16-1 query::=

query
query

図16-2 sfw_block::=

sfw block

図16-3 select_clause::=

select clause

図16-4 non_mt_projterm_list::=

non mt projterm list

図16-5 projterm::=

projterm

(arith_expr )

図16-6 from_clause::=

from clause

図16-7 non_mt_relation_list::=

non mt relation list

図16-8 relation_variable::=

relation variable
identifier

図16-9 window_type::=

window type

図16-10 table_clause::=

table clause

図16-11 opt_where_clause::=

opt where clause

図16-12 opt_group_by_clause::=

opt group by clause

図16-13 order_by_clause::=

order by clause

図16-14 order_by_top_clause::=

order by top clause

図16-15 order_by_list::=

order by list

図16-16 orderterm::=

order term

図16-17 null_spec::=

null spec

図16-18 asc_desc::=

asc desc

図16-19 opt_having_clause::=

opt having clause

図16-20 binary::=

binary

図16-21 idstream_clause::=

idstream clause

図16-22 using_clause::=

using clause

図16-23 usinglist::=

using list

図16-24 usingterm::=

using term

図16-25 usingexpr::=

using expr

図16-26 xmltable_clause::=

xmltable clause

図16-27 xmlnamespace_clause::=

xmlnamespace clause

図16-28 xmlnamespaces_list::=

xmlnamespaces list

図16-29 xml_namespace::=

xmlnamespace

図16-30 xtbl_cols_list::=

xtbl cols list

図16-31 xtbl_col::=

xtbl col

16.2.1 問合せセマンティクス

named_query

Oracle CQL問合せ文自体を指定します。

構文については、問合せを参照してください。

query

Oracle CQL問合せは、次の任意の句から作成できます。

  • sfw_block: select句、from句、および他のオプションの句。

  • binary: オプションの句(通常は集合演算)。

  • xstream_clause: sfw_block句またはbinary句にオプションのリレーションからストリームへの演算子を適用して、問合せから返される結果を制御します。

sfw_block

Oracle CQL問合せのselect、fromおよびその他のオプション句を指定します。次の任意の句を指定できます。

  • select_clause: 指定のストリームまたはビューから選択するストリーム要素。

  • from_clause: 問合せで選択するストリームまたはビュー。

  • opt_where_clause: 問合せの選択に適用するオプションの条件。

  • opt_group_by_clause: 問合せの結果に適用するオプションのグループ化条件。

    order_by_clause: 問合せの結果に適用するオプションの順序付け条件。

  • order_by_top_clause: 問合せの結果に含まれる上位n個の要素に適用するオプションの順序付け条件。

  • opt_having_clause: 指定したconditionTRUEのグループになるように、返されるストリーム要素のグループを制限するために問合せで使用するオプションの句。

select_clause

Oracle CQL問合せ文のselect句を指定します。

アスタリスク(*)を指定した場合、この句では重複とnullを含むすべてのタプルが返されます。

それ以外の場合は、必要になる個別のストリーム要素を指定します。

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

non_mt_projterm_list

Oracle CQL問合せ文のselect句で射影条件または射影条件のカンマ区切りのリストを指定します。

projterm

Oracle CQL問合せ文のselect句で射影条件を指定します。要素のidentifierを使用すると、from_clauseに含まれる任意のストリームまたはビューから任意の要素を選択できます。

オプションで、射影条件に算術式を指定できます。

オプションで、ストリーム要素の名前をそのまま使用するかわりにASキーワードを使用して射影条件の別名を指定できます。

from_clause

問合せで選択する個別のストリームまたはビューを指定して、Oracle CQL文のfrom句を指定します。

外部結合を実行するには、LEFTまたはRIGHT OUTER JOIN ... ON構文を使用します。内部結合を実行するには、WHERE句を使用します。

non_mt_relation_list

Oracle CQL問合せ文のfrom句で、ストリームまたはビュー、またはストリームまたはビューのカンマ区切りのリストを指定します。

relation_variable

Oracle CQL問合せ文で選択されるストリームまたはビューを指定するには、relation_variable文を使用します。

ストリームまたはビューの登録または作成時に使用したidentifierによって、以前に登録または作成したストリームまたはビューを直接指定できます。オプションで、名前をそのまま使用するかわりにASキーワードを使用してストリームまたはビューの別名を指定します。

組込みのストリームからリレーションへの演算子を指定する場合は、window_type句を使用します。オプションで、名前をそのまま使用するかわりにASキーワードを使用してストリームまたはビューの別名を指定します。

データ・ストリーム用に最適化された高度な比較をストリームまたはビューに適用する場合は、pattern_recognition_clauseを使用します。オプションで、名前をそのまま使用するかわりにASキーワードを使用してストリームまたはビューの別名を指定します。

XPathおよびXQueryを使用してxmltypeストリーム要素を処理する場合は、xmltable_clauseを使用します。オプションで、名前をそのまま使用するかわりにASキーワードを使用してストリームまたはビューの別名を指定します。

リレーションとして、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスする場合は、table_clauseを使用します。

詳細は、次を参照してください。

window_type

組込みのストリームからリレーションへの演算子を指定します。

詳細は、「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。

table_clause

データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスします。

TABLE句は返された複数の行をOracle CQLリレーションに変換します。これは外部リレーションであるため、TABLE関数句とストリームを結合する必要があります。Oracle Event Processingでは、結合ストリームに要素が到着したときにのみデータ・カートリッジ・メソッドを呼び出します。

オプションのOFキーワードを使用して、返された配列型またはCollection型に含められる型を指定します。

ASキーワードを使用して、object_exprと返されたリレーションの別名を指定します。

次の点に注意してください。

  • データ・カートリッジ・メソッドは、配列型またはCollection型を返す必要があります。

  • TABLE関数句とストリームを結合する必要があります。

time_spec

範囲または分割された範囲のスライディング・ウィンドウがスライドする時間を指定します。

デフォルト: 単位を指定しない場合、Oracle Event Processingでは[second|seconds]が想定されます。

詳細は、「範囲ベースのストリームからリレーションへのウィンドウ演算子」および「分割されたストリームからリレーションへのウィンドウ演算子」を参照してください。

opt_where_clause

Oracle CQL問合せ文の(オプションの)where句を指定します。

Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。

Oracle CQLでは(SQLと同様)、FROM句はWHERE句の前に評価されます。次のOracle CQL問合せがあるとします。

SELECT ... FROM S MATCH_RECOGNIZE ( .... ) as T WHERE ...

この問合せでは、S MATCH_RECOGNIZE ( .... ) as Tは、FROM句内の副問合せと同様、最初でWHERE句の前に評価されます。このため、MATCH_RECOGNIZE句とWHERE句の両方が同じOracle CQL問合せ内で使用されることはほとんどありません。かわりに、通常、ビューを使用して必要なWHERE句をストリームに適用し、MATCH_RECOGNIZE句を適用する問合せ内のビューから選択します。

詳細は、次を参照してください。

opt_group_by_clause

Oracle CQL問合せ文の(オプションの)GROUP BY句を指定します。選択されたストリーム要素をexprの値に基づいてグループ化し、グループごとに単一の(集計)サマリー結果を返す場合は、GROUP BY句を使用します。

GROUP BY句の式には、ストリーム要素がselectリストにあるかどうかにかかわらず、FROM句の任意のストリーム要素またはビューを含めることができます。

GROUP BY句ではストリーム要素がグループ化されますが、結果セットの順序は保証されません。グループの並べ替えを行うには、ORDER BY句を使用します。

Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。

詳細は、次を参照してください。

order_by_clause

1つ以上の並べ替え条件を含むカンマ区切りのリストとして、Oracle CQL問合せ文のORDER BY句を指定します。ORDER BY句を使用して、ルールの左側のストリーム要素が評価される順序を指定します。exprは、ディメンションまたはメジャー列に変換される必要があります。この句ではストリームが返されます。

ORDER BYとORDER BY ROWSのどちらでも、ソートの方向をASCまたはESCキーワードを使用して昇順または降順として指定できます。NULLS FIRSTまたはNULLS LASTを使用してソートする場合、null項目を最初または最後のどちらにリストするかも指定できます。

詳細は、次を参照してください。

order_by_top_clause

ROWSキーワードと要素数の整数(n)が後続する1つ以上の並べ替え条件を含むカンマ区切りのリストとして、Oracle CQL問合せ文のORDER BY句を指定します。この形式のORDER BY句を使用して、ストリームまたはリレーションの上位n個の要素を選択します。この句ではリレーションが返されます。

次の問合せの例を考えます。

  • 任意の時点で、次のサンプル問合せの出力は、ストリーム全体の上位10個の銘柄記号が含まれるリレーションになります。

    select stock_symbols from StockQuotes order by stock_price rows 10
    
  • 任意の時点で、次のサンプル問合せの出力は、過去1時間のデータの上位10個の銘柄記号が含まれるリレーションになります。

    select stock_symbols from StockQuotes[range 1 hour] order by stock_price rows 10
    

詳細は、次を参照してください。

order_by_list

(オプションの)ORDER BY句で、1つ以上の並べ替え条件のカンマ区切りのリストを指定します。

orderterm

ストリーム要素またはストリーム要素への位置指定索引 (constant int)。オプションで、NULLSキーワードを使用すると、nullを順序の最初または最後のどちらにするかを構成できます。

order_expr

order_exprにはattrまたはconstant_intを指定できます。attrには任意のストリーム要素または疑似列を指定できます。

null_spec

指定の並べ替え条件でnullを順序の最初にするか(NULLS FIRST)、または最後にするか(NULLS LAST)を指定します。

asc_desc

並べ替え条件が昇順(ASC)または降順(DESC)のどちらであるかを指定します。

opt_having_clause

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

GROUP BYHAVINGopt_where_clauseの後に指定します。GROUP BYHAVINGの両方を指定する場合は、どちらの順序でも指定できます。

Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。

詳細は、次を参照してください。

binary

2つのストリームまたはビューで返されるタプルで演算を実行するには、binary句を使用します。これらの多くでは、集合演算が実行され、オペランドとして2つのリレーションが返されます。ただし、UNION ALL演算子では、かわりに本来バインドされていない2つのストリームが返されます。

idstream_clause

問合せに適用されるリレーションからストリームへのIStreamまたはDStream演算子を指定するには、idstream_clauseを使用します。

詳細は、「リレーションからストリームへの演算子」を参照してください

using_clause

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

詳細は、「問合せ結果の差分の検出」を参照してください。

usinglist

usinglist句を使用して、問合せのIStreamまたはDStreamの差分検出に使用する列を指定します。次の項目によって列を指定できます。

  • 属性名: 属性名で選択する場合に、このオプションを使用します。

  • 別名: 別名が指定されている式の結果を含める場合に、このオプションを使用します。

  • 位置: 別名が指定されていない式の結果を含める場合に、このオプションを使用します。

    位置は、左から右に読み取る、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>

詳細は、「問合せ結果の差分の検出」を参照してください。

xmltable_clause

XPathおよびXQueryを使用してxmltypeストリーム要素を処理するには、xmltable_clauseを使用します。XMLネームスペースの有無にかかわらず、XML表の1つ以上の列を含むカンマ区切りのリストを指定できます。

pattern_recognition_clause

データ・ストリーム用に最適化された高度な比較を実行するには、pattern_recognition_clauseを使用します。

詳細および例については、「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。

16.2.2 問合せの例

詳細は、「Oracle CQLの問合せ、ビューおよび結合」を参照してください。

単純な問合せの例

次の例に、ストリーム要素orderAmountが10000を超える場合のすべての(*)タプルをストリームOrderStreamから選択する単純な問合せq0を登録する方法を示します。

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

HAVINGの例

問合せq4とデータ・ストリームS2があるとします。ストリームS2のスキーマは(c1 integer, c2 integer)です。この問合せはリレーションを返します。

<query id="q4"><![CDATA[ 
    select 
        c1,
        sum(c1) 
    from 
        S2[range 10] 
    group by 
        c1 
    having 
        c1 > 0 and sum(c1) > 1
]]></query>
Timestamp   Tuple
1000        ,2
2000        ,4
3000        1,4
5000        1,
6000        1,6
7000        ,9
8000        ,
Timestamp   Tuple Kind  Tuple
5000:       +           1,2
6000:       -           1,2
6000:       +           1,3

BINARYの例: UNIONとUNION ALL

UNIONおよびUNION ALL演算子はどちらも、2つのオペランドを使用し、それらの要素を組み合せます。UNION ALL演算子の結果には、重複を含め、2つのオペランドのすべての要素が含まれます。UNION演算子の結果では重複が除外されます。

UNION演算子では2つのリレーションのみを受け入れ、その出力として1つのリレーションを生成します。この演算子では、重複を削除するために、Oracle CQLエンジンで両方のオペランドに含まれるすべての要素を追跡する必要があるので、ストリームは受け入れられません。本来バインドされないストリームでは、これは不可能です。

UNION ALL演算子では、2つのストリームを受け入れる(1つのストリームを生成する)か、2つのリレーションを受け入れる(1つのリレーションを生成する)かのいずれかです。1つのストリームと1つのリレーションをオペランドとして使用することは、どちらの演算子でも無効です。

それぞれがリレーションR1R2の場合、UNION問合せq1はリレーション、UNION ALL問合せq2はリレーションを返します。

<query id="q1"><![CDATA[ 
    R1 UNION R2 
]]></query>
<query id="q2"><![CDATA[ 
    R1 UNION ALL R2 
]]></query>
Timestamp   Tuple Kind  Tuple
   200000:  +           20,0.2
   201000:  -           20,0.2
   400000:  +           30,0.3
   401000:  -           30,0.3
100000000:  +           40,4.04
100001000:  -           40,4.04
Timestamp   Tuple Kind  Tuple
     1002:  +           15,0.14
     2002:  -           15,0.14
   200000:  +           20,0.2
   201000:  -           20,0.2
   400000:  +           30,0.3
   401000:  -           30,0.3
100000000:  +           40,4.04
100001000:  -           40,4.04
Timestamp   Tuple Kind  Tuple
     1002:  +           15,0.14
     2002:  -           15,0.14
   200000:  +           20,0.2
   201000:  -           20,0.2
   400000:  +           30,0.3
   401000:  -           30,0.3
100000000:  +           40,4.04
100001000:  -           40,4.04

注意:

UNIONは、出力の重複を削除する二項演算子の1つです。上記は、属性がCQLネイティブ・タイプである自明な例です。入力リレーションがOBJECTタイプ属性である場合、ユーザーはObject定義クラスにhashCode()およびequals()メソッドの正しい実装を追加して、CQLエンジンで2つの比較タプルのメンバー・オブジェクト属性の等価を計算できるようにする必要があります。

次の出力は、UNION ALLでオペランドとして2つのリレーションを使用して得られるものです。

Timestamp   Tuple Kind  Tuple
     1002:  +           15,0.14
     2002:  -           15,0.14
   200000:  +           20,0.2
   200000:  +           20,0.2
    20100:  -           20,0.2
   201000:  -           20,0.2
   400000:  +           30,0.3
   400000:  +           30,0.3
   401000:  -           30,0.3
   401000:  -           30,0.3
100000000:  +           40,4.04
100000000:  +           40,4.04
 10001000:  -           40,4.04
100001000:  -           40,4.04
Timestamp     Tuple
   100000:    20,0.1
   150000:    15,0.1
   200000:    5,0.2
   400000:    30,0.3
100000000:    8,4.04
Timestamp     Tuple
     1001:    10,0.1
     1002:    15,0.14
   200000:    20,0.2
   400000:    30,0.3
100000000:    40,4.04

次の出力は、UNION ALLでオペランドとして前述の2つのストリームを使用して得られるものです。すべての要素は、挿入されたイベントです。

Timestamp   Tuple Kind  Tuple
     1001:  +           10,0.1
     1002:  +           15,0.14
   100000:  +           20,0.1
   150000:  +           15,0.14
   200000:  +           20,0.2
   200000:  +           5,0.2
   400000:  +           30,0.3
   400000:  +           30,0.3
100000000:  +           40,4.04
100000000:  +           8,4.04

BINARYの例: INTERSECT

INTERSECT演算子では、両方のオペランド・リレーションにある要素のみを使用して、1つのリレーションを(重複を削除して)返します。

それぞれがリレーションR1R2の場合、INTERSECT問合せq1はリレーションを返します。

<query id="q1"><![CDATA[ 
    R1 INTERSECT R2 
]]></query>
Timestamp   Tuple Kind  Tuple
1000:        +          10,30
1000:        +          10,40
2000:        +          11,20
3000:        -          10,30
3000:        -          10,40
Timestamp   Tuple Kind  Tuple
1000:       +           10,40
2000:       +           10,30
2000:       -           10,40
3000:       -           10,30
Timestamp   Tuple Kind  Tuple
1000:       +           10,40
2000:       +           10,30
2000:       -           10,40
3000:       -           10,30

BINARYの例: EXCEPTとMINUS

データベースのプログラミングと同様に、EXCEPT演算子とMINUS演算子は非常に似ています。どちらも2つのオペランドとしてリレーションを使用します。どちらも結果は、基本的に要素が1つ目のオペランド・リレーションの要素(2つ目のオペランド・リレーションには含まれていない)であるリレーションになります。

EXCEPTMINUSの重要な違いは、次のように、1つ目と2つ目のリレーション・オペランドの間で発生する重複の処理方法にあります。

  • EXCEPT演算子の結果は、1つ目のリレーションの要素で構成されるリレーションになり、2つ目のリレーションでも検出された要素はその検出数まで削除されます。つまり、ある要素が1つ目のリレーションでm回発生し、2つ目のリレーションでn回発生する場合、結果におけるその要素の数はmからnを引いた数となり、nがmより多い場合は0になります。

  • MINUS演算子の結果は、1つ目のリレーションの要素から2つ目のリレーションでも検出された要素を引いた要素で構成され、それぞれのリレーションでそれらの要素がいくつ検出されたかは関係ありません。MINUS演算子では、1つ目のリレーションで検出された重複要素も削除されるため、各重複項目は結果では一意になります。

次の例では、MINUS演算子について説明しています。それぞれがリレーションR1R2の場合、MINUS問合せq1はリレーションを返します。

<query id="q1BBAQuery"><![CDATA[ 
    R1 MINUS R2 
]]></query>
Timestamp   Tuple Kind  Tuple
1500:       +           10,40
1800:       +           10,30
2000:       +           10,40
2000:       +           10,40
2100:       -           10,40
3000:       -           10,30
Timestamp   Tuple Kind  Tuple
1000:       +           11,20
2000:       +           10,40
3000:       -           10,30
Timestamp   Tuple Kind  Tuple
1500:       +           10,40
1800:       +           10,30
2000:       -           10,40

次の例では、EXCEPT演算子について説明しています。それぞれがリレーションR1R2の場合、EXCEPT問合せq1はリレーションを返します。

<query id="exceptQuery"><![CDATA[ 
    R1 EXCEPT R2 
]]></query>
Timestamp   Tuple Kind  Tuple
1500:       +           10,40
1800:       +           10,30
2000:       +           10,40
2000:       +           10,40
2100:       -           10,40
3000:       -           10,30
Timestamp   Tuple Kind  Tuple
1000:       +           11,20
2000:       +           10,40
3000:       -           10,40
Timestamp   Tuple Kind  Tuple
1500:       +           10,40
1800:       +           10,30
2000:       +           10,40
2000:       -           10,40

BINARYの例: INとNOT IN

この使用方法では、問合せはバイナリの問合せになります。

in_condition_set::=

in condition set

注意:

「メンバーシップ条件としてのINとNOT INの使用」で説明しているように、この使用方法はin_condition_membershipと組み合せることはできません。

ビューV3およびV4、問合せQ1、データ・ストリームS3 (スキーマ(c1 integer, c2 integer))およびS4 (スキーマ(c1 integer, c2 integer))があるとします。この条件テストでは、左のリレーションの属性の数およびデータ型は、右のリレーションの属性の数およびデータ型と同じである必要があります。次の例は、問合せが返すリレーションを示しています。

<view id="V3" schema="c1 c2"><![CDATA[ 
    select * from S3[range 2] 
]]></query>
<view id="V4" schema="c1 d1"><![CDATA[ 
    select * from S4[range 1]
]]></query>
<query id="Q1"><![CDATA[ 
     v3 not in v4
]]></query>
Timestamp   Tuple
1000        10, 30
1000        10, 40
2000        11, 20
3000        12, 40
3000        12, 30
3000        15, 50
h 2000000
Timestamp   Tuple
1000        10, 40
2000        10, 30
2000        12, 40
h 2000000
Timestamp   Tuple Kind  Tuple
1000:       +           10,30
1000:       +           10,40
1000:       -           10,30
1000:       -           10,40
2000:       +           11,20
2000:       +           10,30
2000:       +           10,40
2000:       -           10,30
2000:       -           10,40
3000:       +           15,50
3000:       +           12,40
3000:       +           12,30
4000:       -           11,20
5000:       -           12,40
5000:       -           12,30
5000:       -           15,50

SelectとDistinctの例

問合せq1について考えてみます。データ・ストリームSの場合、問合せはリレーションを返します。

<query id="q1"><![CDATA[ 
    SELECT DISTINCT c1 FROM S WHERE c1 > 10 
]]></query>
Timestamp   Tuple
 1000       23
 2000       14
 3000       13
 5000       22
 6000       11
 7000       10
 8000        9
10000        8
11000        7
12000       13
13000       14
Timestamp   Tuple
1000        23
2000        14
3000        13
5000        22
6000        11

XMLTABLEの問合せの例

問合せq1とデータ・ストリームSがあるとします。ストリームSのスキーマは(c1 xmltype)です。この問合せはリレーションを返します。

XMLTABLEの詳細は、「XMLTABLEの問合せ」を参照してください。

<query id="q1"><![CDATA[ 
    SELECT
        X.Name, 
        X.Quantity 
    FROM S1, 
        XMLTABLE (
            "//item" PASSING BY VALUE S1.c2 as "." 
            COLUMNS 
                Name CHAR(16) PATH "/item/productName", 
                Quantity INTEGER PATH "/item/quantity"
        ) AS X
]]></query>
Timestamp   Tuple
3000        "<purchaseOrder><shipTo><name>Alice Smith</name><street>123 Maple Street</street><city>Mill Valley</city><state>CA</state><zip>90952</zip> </shipTo><billTo><name>Robert Smith</name><street>8 Oak Avenue</street><city>Old Town</city><state>PA</state> <zip>95819</zip> </billTo><comment>Hurry, my lawn is going wild!</comment><items> <item><productName>Lawnmower </productName><quantity>1</quantity><USPrice>148.95</USPrice><comment>Confirm this is electric</comment></item><item> <productName>Baby Monitor</productName><quantity>1</quantity> <USPrice>39.98</USPrice> <shipDate>1999-05-21</shipDate></item></items> </purchaseOrder>"
4000        "<a>hello</a>"
Timestamp   Tuple Kind  Tuple
3000:       +           <productName>Lawnmower</productName>,<quantity>1</quantity>
3000:       +           <productName>Baby Monitor</productName>,<quantity>1</quantity>

XMLネームスペースを使用するXMLTABLEの問合せの例

問合せq1とデータ・ストリームS1があるとします。ストリームS1のスキーマは(c1 xmltype)です。この問合せはリレーションを返します。

XMLTABLEの詳細は、「XMLTABLEの問合せ」を参照してください。

<query id="q1"><![CDATA[ 
    SELECT * 
    FROM S1, 
        XMLTABLE ( 
            XMLNAMESPACES('http://example.com' as 'e'), 
            'for $i in //e:emps return $i/e:emp' PASSING BY VALUE S1.c1 as "." 
            COLUMNS 
                empName char(16) PATH 'fn:data(@ename)', 
                empId integer PATH 'fn:data(@empno)'
        ) AS X
]]></query>
Timestamp   Tuple
3000        "<emps xmlns=\"http://example.com\"><emp empno=\"1\" deptno=\"10\" ename=\"John\" salary=\"21000\"/><emp empno=\"2\" deptno=\"10\" ename=\"Jack\" salary=\"310000\"/><emp empno=\"3\" deptno=\"20\" ename=\"Jill\" salary=\"100001\"/></emps>"
h 4000
Timestamp   Tuple Kind  Tuple
3000:       +     John,1
3000:       +     Jack,2
3000:       +     Jill,3

データ・カートリッジTABLEの問合せの例: イテレータ

メソッドgetIteratorを持つデータ・カートリッジ(MyCartridge)があるとします。

...
    public static Iterator<Integer> getIterator() {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        return list.iterator();
    }
...

問合せq1について考えてみます。データ・ストリームS0の場合、問合せはリレーションを返します。

<query id="q1"><![CDATA[ 
    select S1.c1, S1.c2, S2.c1 
    from 
        S0[now] as S1, 
        table (com.acme.MyCartridge.getIterator() as c1) of integer as S2
]]></query>

Timestamp   Tuple
1           1, abc
2           2, ab
3           3, abc
4           4, a
h 200000000
Timestamp   Tuple Kind  Tuple
1:          +           1,abc,1
1:          +           1,abc,2
1:          -           1,abc,1
1:          -           1,abc,2
2:          +           2,ab,1
2:          +           2,ab,2
2:          -           2,ab,1
2:          -           2,ab,2
3:          +           3,abc,1
3:          +           3,abc,2
3:          -           3,abc,1
3:          -           3,abc,2
4:          +           4,a,1
4:          +           4,a,2
4:          -           4,a,1
4:          -           4,a,2

データ・カートリッジTABLEの問合せの例: 配列

メソッドgetArrayを持つデータ・カートリッジ(MyCartridge)があるとします。

...
    public static Integer[] getArray(int c1) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        return list.toArray(new Integer[2]);;
    }
...

問合せq1について考えてみます。データ・ストリームS0の場合、問合せはリレーションを返します。

<query id="q1"><![CDATA[ 
    select S1.c1, S1.c2, S2.c1 
    from 
        S0[now] as S1, 
        table (com.acme.MyCartridge.getArrayS1.c1) as c1) of integer as S2
]]></query>

Timestamp   Tuple
1           1, abc
2           2, ab
3           3, abc
4           4, a
h 200000000
Timestamp   Tuple Kind  Tuple
1:          +           1,abc,1
1:          +           1,abc,2
1:          -           1,abc,1
1:          -           1,abc,2
2:          +           2,ab,2
2:          +           2,ab,4
2:          -           2,ab,2
2:          -           2,ab,4
3:          +           3,abc,3
3:          +           3,abc,6
3:          -           3,abc,3
3:          -           3,abc,6
4:          +           4,a,4
4:          +           4,a,8
4:          -           4,a,4
4:          -           4,a,8

データ・カートリッジTABLEの問合せの例: コレクション

メソッドgetCollectionを持つデータ・カートリッジ(MyCartridge)があるとします。

...
    public HashMap<Integer,String> developers;
    developers = new HashMap<Integer,String>();
    developers.put(2, "Mohit");
    developers.put(4, "Unmesh");
    developers.put(3, "Sandeep");
    developers.put(1, "Swagat");

    public HashMap<Integer,String> qaengineers;
    qaengineers = new HashMap<Integer,String>();
    qaengineers.put(4, "Terry");
    qaengineers.put(5, "Tony");
    qaengineers.put(3, "Junger");
    qaengineers.put(1, "Arthur");
...
    public Collection<String> getEmployees(int exp_yrs) {
        LinkedList<String> employees = new LinkedList<String>();
        employees.add(developers.get(exp_yrs));    
        employees.add(qaengineers.get(exp_yrs));
        return employees;
  }
...

問合せq1について考えてみます。データ・ストリームS0の場合、問合せはリレーションを返します。

<query id="q1"><![CDATA[ 
    RStream(
        select S1.c1, S2.c1 
        from 
            S0[now] as S1, 
            table(S1.c2.getEmployees(S1.c1) as c1) of char as S2
    )
]]></query>

Timestamp   Tuple
1           1, abc
2           2, ab
3           3, abc
4           4, a
h 200000000
Timestamp   Tuple Kind  Tuple
1:          +           1,Swagat
1:          +           1,Arthur
2:          +           2,Mohit
3:          +           3,Sandeep
3:          +           3,Junger
4:          +           4,Unmesh
4:          +           4,Terry

ORDER BY問合せの例

ORDER BY句にストリームを入力して、重複するタイムスタンプを持つイベントをソートします。ORDER BYは入力がストリームの場合のみ有効で、同じタイムスタンプのイベント間のソートのみ行います。その出力は、ソートされたイベントを持つストリームです。

問合せq1について考えてみます。データ・ストリームS0の場合、問合せはリレーションを返します。この問合せでは、タイムスタンプが重複するイベントをタプル値により昇順でソートします。

<query id="q1"><![CDATA[ 
    SELECT * 
    FROM S0 
    ORDER BY c1,c2 ASC
]]></query>
Timestamp   Tuple
1000        7, 15
2000        7, 14
2000        5, 23
2000        5, 15
2000        5, 15
2000        5, 25
3000        3, 12
3000        2, 13
4000        4, 17
5000        1, 9
h 1000000000
Timestamp   Tuple Kind  Tuple
1000:       +           7,15
2000:       +           5,15
2000:       +           5,15
2000:       +           5,23
2000:       +           5,25
3000:       +           2,13
3000:       +           3,19
4000:       +           4,17
5000:       +           1,9

ORDER BY ROWSの問合せの例

ORDER BY句にROWSキーワードを指定して使用すると、問合せから返されたイベントを出力に含めるかどうかを判断するための順序付け基準が使用されます。ORDER BY ROWSでは、ストリーム入力またはリレーション入力のいずれかを受け入れ、リレーションを出力します。

ORDER BY ROWS句では、最大サイズがROWSキーワードで指定された数であるイベントの集合が保持されます。新規イベントが受信されると、順序基準とROWS制限に基づいて評価され、出力に追加するかどうかが判断されます。

ORDER BY ROWSの出力は、ORDER BY句の出力のように、順序付け基準に基づいて並べられることはありません。かわりに、ORDER BY ROWSでは、順序付け基準と指定行数を使用して、イベントを受信どおりに出力に加えるかどうかが決められます。

問合せq1について考えてみます。データ・ストリームS0の場合、問合せはリレーションを返します。

<query id="q1"><![CDATA[ 
    SELECT c1 ,c2 
    FROM S0 
    ORDER BY c1,c2 ROWS 5
]]></query>
Timestamp   Tuple
1000        7, 15
2000        7, 14
2000        5, 23
2000        5, 15
2000        5, 15
2000        5, 25
3000        2, 13
3000        3, 19
4000        4, 17
5000        1, 9
h 1000000000
Timestamp   Tuple Kind  Tuple
1000:       +           7,15
2000:       +           7,14
2000:       +           5,23
2000:       +           5,15
2000:       +           5,15
2000:       -           7,15
2000:       +           5,25
3000:       -           7,14
3000:       +           2,13
3000:       -           5,25
3000:       +           3,19
4000:       -           5,23
4000:       +           4,17
5000:       -           5,15
5000:       +           1,9

次の例では、問合せでPARTITIONキーワードを使用して、イベントをソートし、出力サイズを制限するタプルのプロパティを指定しています。ここでは、PARTITIONキーにより、入力内のイベントがそれらのシンボル値に基づいて評価されるように指定します。

すなわち、出力にイベントを含めるかどうかを判断する際、問合せでは出力内で同じシンボルを持つ既存のイベント・セットを調べます。ROWS制限は2で、これは問合せでイベント数が2つまでのソート済イベント・セットが保持されることを意味します。たとえば、ORCLシンボルを持つイベントがすでに2つある場合、もう1つのORCLイベントを出力に追加するには、出力内でORCLシンボルを持つ最も古い要素を削除する必要があります。

また、問合せでは、値のプロパティによってイベントの順序付けを行うため、新しいイベントの出力を検討する際にもプロパティが検討されます。ここでは、DESCキーワードは、イベントが降順に並べられることを指定します。新しいイベントは、出力セット内にすでに存在するイベントの後にない場合、出力には含まれません。

<query id="q1"><![CDATA[ 
    SELECT symbol, value
    FROM S0 
    ORDER BY value DESC ROWS 2 
    PARTITION BY symbol
]]></query>
Timestamp   Tuple
1000        ORCL, 500
1100        MSFT, 400
1200        INFY, 200
1300        ORCL, 503
1400        ORCL, 509
1500        ORCL, 502
1600        MSFT, 405
1700        INFY, 212
1800        INFY, 209
1900        ORCL, 512
2000        ORCL, 499
2100        MSFT, 404
2200        MSFT, 403
2300        INFY, 215
2400        MSFT, 415
2500        ORCL, 499
2600        INFY, 211
Timestamp    Tuple Kind    Tuple
1000         +             ORCL,500
1100         +             MSFT,400
1200         +             INFY,200
1300         +             ORCL,503
1400         -             ORCL,500
1400         +             ORCL,509
1600         +             MSFT,405
1700         +             INFY,212
1800         -             INFY,200
1800         +             INFY,209
1900         -             ORCL,503
1900         +             ORCL,512
2100         -             MSFT,400
2100         +             MSFT,404
2300         -             INFY,209
2300         +             INFY,215
2400         -             MSFT,404
2400         +             MSFT,415

16.3 ビュー

目的

後続のOracle CQL文のidentifierで参照される、基本のストリームまたはリレーションに対するビューを作成するには、view文を使用します。

前提条件

詳細は、次を参照してください。

構文

次の例に示すように、<view></view>要素でビューを表します。

view要素は2つの属性を持ちます。

  • id: view要素のid属性としてidentifierを指定します。

    id値は、「図7-6」で指定された仕様に準拠する必要があります。

  • schema: オプションで、属性名のスペース区切りリストとしてviewのスキーマを指定します。

    Oracle Event Processingサーバーではタイプが推測されます。

<view id="v2" schema="cusip bid ask"><![CDATA[ 
    IStream(select * from S1[range 10 slide 10]) 
]]></view>

ビュー本体の構文は問合せと同じです。詳細は、問合せを参照してください。

次の例では、この文でサポートされる様々なセマンティクスを示します。詳細は、「Oracle CQLの問合せ、ビューおよび結合」を参照してください。

次の例に、ビューv2を登録する方法を示します。

図16-1 ビュー登録の例

<view id="v2" schema="cusip bid ask"><![CDATA[ 
    IStream(select * from S1[range 10 slide 10]) 
]]></view>