14 Oracle CQL文
この章では、Oracle Continuous Query Language (Oracle CQL)でサポートされているデータ定義言語(DDL)文について説明します。
14.1 問合せ
目的
後続のOracle CQL文のidentifier
で参照されるOracle CQL問合せを定義するには、query文を使用します。
前提条件
問合せがストリームまたはビューを参照する場合は、ストリームまたはビューが存在している必要があります。
問合せがすでに存在する場合は、GGSAサーバーから例外がスローされます。
構文
図14-1 sfw_block::=

図14-2 select_clause::=

図14-3 non_mt_projterm_list::=

図14-4 projterm::=

図14-5 from_clause::=

図14-6 non_mt_relation_list::=

図14-7 relation_variable::=


図14-8 window_type::=

図14-9 table_clause::=

図14-10 opt_where_clause::=

図14-11 opt_group_by_clause::=

図14-12 order_by_clause::=

図14-13 order_by_top_clause::=

図14-14 order_by_list::=

図14-15 orderterm::=

図14-16 null_spec::=

図14-17 asc_desc::=

図14-18 opt_having_clause::=

図14-19 binary::=

図14-20 idstream_clause::=

図14-21 using_clause::=

図14-22 usinglist::=

図14-23 usingterm::=

図14-24 usingexpr::=

14.1.1 問合せセマンティクス
query
Oracle CQL問合せは、次の任意の句から作成できます。
-
sfw_block
: select句、from句、および他のオプションの句。 -
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
: 指定したcondition
がTRUE
のグループになるように、返されるストリーム要素のグループを制限するために問合せで使用するオプションの句。
select_clause
Oracle CQL問合せ文のselect句を指定します。
アスタリスク(*
)を指定した場合、この句では重複とnullを含むすべてのタプルが返されます。
それ以外の場合は、必要になる個別のストリーム要素を指定します。
選択した重複タプルの各セットで1つのコピーのみが返されるようにするには、オプションで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
キーワードを使用してストリームまたはビューの別名を指定します。
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
句を使用して、返されたストリーム要素のグループを、指定されたcondition
がTRUE
のグループに制限します。この句を省略すると、GGSAではすべてのグループのサマリー結果が返されます。
GROUP
BY
と HAVING
はopt_where_clause
の後に指定します。GROUP
BY
とHAVING
の両方を指定する場合は、どちらの順序でも指定できます。
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>
pattern_recognition_clause
データ・ストリーム用に最適化された高度な比較を実行するには、pattern_recognition_clause
を使用します。
詳細および例については、「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。
14.1.2 問合せの例
単純な問合せの例
次の例に、ストリーム要素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
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