この章では、Oracle Continuous Query Language (Oracle CQL)のデータ定義言語(DDL)文について説明します。
この章の内容は次のとおりです。
Oracle CQLでは次のDDL文をサポートしています。
注意: ストリーム入力の例で、 |
詳細は、次を参照してください。
目的
後続のOracle CQL文のidentifier
で参照されるOracle CQL問合せを定義するには、query文を使用します。
要件
問合せがストリームまたはビューを参照する場合は、ストリームまたはビューが存在している必要があります。
問合せがすでに存在する場合は、Oracle Event Processingサーバーで例外がスローされます。
詳細は、次を参照してください。
構文
例22-1に示すように、<query></query>
要素で問合せを表します。
query
要素は1つの属性を持ちます。
id
: query
要素のid
属性としてidentifier
を指定します。
id
値はidentifier::=で指定される仕様に準拠する必要があります。
例22-1 <query></query>要素の問合せ
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
query::=
(sfw_block::=、idstream_clause::=、binary::=、using_clause::=)
sfw_block::=
(select_clause::=、from_clause::=、opt_where_clause::=、opt_group_by_clause::=、order_by_clause::=、order_by_top_clause::=、opt_having_clause::=)
projterm::=
from_clause::=
(non_mt_relation_list::=、relation_variable::=、non_mt_cond_list::=)
(identifier::=、window_type::=、pattern_recognition_clause::=、xmltable_clause::=、object_expr::=、datatype::=、table_clause::=)
window_type::=
(identifier::=、non_mt_attr_list::=、time_spec::=)
table_clause::=
(object_expr::=、identifier::=、datatype::=)
(pattern_partition_clause::=、order_by_list::=)
orderterm::=
(order_expr::=、null_spec::=、asc_desc::=)
null_spec::=
asc_desc::=
binary::=
using_clause::=
usinglist::=
usingterm::=
usingexpr::=
(xmlnamespace_clause::=、const_string::=、xqryargs_list::=、xtbl_cols_list::=)
xmlnamespace_clause::=
xmlnamespaces_list::=
xml_namespace::=
xtbl_cols_list::=
xtbl_col::=
セマンティクス
named_query
Oracle CQL問合せ文自体を指定します(「query」を参照)。
構文については、「Query」を参照してください。
query
Oracle CQL問合せは、次の任意の句から作成できます。
sfw_block
: select、fromおよびその他のオプションの句(「sfw_block」を参照)。
binary
: オプションの句、多くの場合、集合演算(「binary」を参照)。
xstream_clause
: sfw_block
またはbinary
句にオプションのリレーションからストリームへの演算子を適用して、問合せが結果を返す方法を制御します(「idstream_clause」を参照)。
構文については、query::=を参照してください。
sfw_block
Oracle CQL問合せのselect、fromおよびその他のオプション句を指定します。次の任意の句を指定できます。
select_clause
: 指定したストリームまたはビューから選択されるストリーム要素(「select_clause」を参照)。
from_clause
: 問合せで選択されるストリームまたはビュー(「from_clause」を参照)。
opt_where_clause
: 問合せが選択した内容に適用されるオプションの条件(「opt_where_clause」を参照)。
opt_group_by_clause
: 問合せの結果に適用されるオプションのグループ化条件(「opt_group_by_clause」を参照)。
order_by_clause
: 問合せの結果に適用されるオプションの並べ替え条件(「order_by_clause」を参照)。
order_by_top_clause
: 問合せの結果の上位n
個の要素に適用されるオプションの並べ替え条件(「order_by_top_clause」を参照)。
opt_having_clause
: 返されたストリーム要素のグループを指定されたcondition
がTRUE
のグループに制限するために問合せで使用されるオプションの句(「opt_having_clause」を参照)。
構文については、sfw_block::=(親: query::=)を参照してください。
select_clause
Oracle CQL問合せ文のselect句を指定します。
アスタリスク(*
)を指定した場合、この句では重複とnullを含むすべてのタプルが返されます。
それ以外の場合は、必要なストリーム要素を個別に指定します(「non_mt_projterm_list」を参照)。
選択した重複タプルの各セットで1つのコピーのみが返されるようにするには、オプションでdistinct
を指定します。重複タプルとはselectリスト内の各式と一致する値を持つタプルです。例については、「SelectとDistinctの例」を参照してください。
構文については、select_clause::=(親: sfw_block::=)を参照してください。
non_mt_projterm_list
Oracle CQL問合せ文のselect句で射影条件(「projterm」)または射影条件のカンマ区切りのリストを指定します。
構文については、non_mt_projterm_list::=(親: select_clause::=)を参照してください。
projterm
Oracle CQL問合せ文のselect句で射影条件を指定します。from_clause
(「from_clause」を参照)の任意のストリームまたはビューから、要素のidentifier
を使用して任意の要素を選択できます。
オプションで、射影条件に算術式を指定できます。
オプションで、ストリーム要素の名前をそのまま使用するかわりにAS
キーワードを使用して射影条件の別名を指定できます。
構文については、projterm::=(親: non_mt_projterm_list::=)を参照してください。
from_clause
問合せで選択される個別のストリームまたはビューを指定して、Oracle CQL文のfrom句を指定します(「non_mt_relation_list」を参照)。
外部結合を実行するには、LEFT
またはRIGHT OUTER JOIN ... ON
構文を使用します。内部結合を実行するには、WHERE
句を使用します。
詳細は、次を参照してください。
構文については、from_clause::=(親: sfw_block::=)。
non_mt_relation_list
Oracle CQL問合せ文のfrom句で、ストリームまたはビュー(「relation_variable」)、または、ストリームまたはビューのカンマ区切りのリストを指定します。
構文については、non_mt_relation_list::=(親: from_clause::=)を参照してください。
relation_variable
Oracle CQL問合せ文で選択されるストリームまたはビューを指定するには、relation_variable
文を使用します。
ストリームまたはビューの登録または作成時に使用したidentifier
によって、以前に登録または作成したストリームまたはビューを直接指定できます。オプションで、名前をそのまま使用するかわりにAS
キーワードを使用してストリームまたはビューの別名を指定します。
組込みのストリームからリレーションへの演算子を指定するには、window_type
句を使用します(「window_type」を参照)。オプションで、名前をそのまま使用するかわりにAS
キーワードを使用してストリームまたはビューの別名を指定します。
データ・ストリーム用に最適化された高度な比較をストリームまたはビューに適用するには、pattern_recognition_clause
を使用します(「pattern_recognition_clause」を参照)。オプションで、名前をそのまま使用するかわりにAS
キーワードを使用してストリームまたはビューの別名を指定します。
XPathおよびXQueryを使用してxmltype
ストリーム要素を処理するには、xmltable_clause
を使用します(「xmltable_clause」を参照)。オプションで、名前をそのまま使用するかわりにAS
キーワードを使用してストリームまたはビューの別名を指定します。
リレーションとして、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスするには、table_clause
を使用します(「table_clause」を参照)。
詳細は、次を参照してください。
構文については、relation_variable::=(親: non_mt_relation_list::=)を参照してください。
window_type
組込みのストリームからリレーションへの演算子を指定します。
詳細は、1.1.3項「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。
構文については、window_type::=(親: relation_variable::=)を参照してください。
table_clause
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスします。
TABLE
句は返された複数の行をOracle CQLリレーションに変換します。これは外部リレーションであるため、TABLE
関数句とストリームを結合する必要があります。Oracle Event Processingでは、結合ストリームに要素が到着したときにのみデータ・カートリッジ・メソッドを呼び出します。
オプションのOF
キーワードを使用して、返された配列型またはCollection
型に含められる型を指定します。
AS
キーワードを使用して、object_expr
と返されたリレーションの別名を指定します。
次の点に注意してください。
データ・カートリッジ・メソッドは、配列型またはCollection
型を返す必要があります。
TABLE
関数句とストリームを結合する必要があります。
例については、次の項を参照してください。
詳細は、次を参照してください。
構文については、table_clause::=(親: relation_variable::=)を参照してください。
time_spec
範囲または分割された範囲のスライディング・ウィンドウがスライドする時間を指定します。
デフォルト: 単位を指定しない場合、Oracle Event Processingでは[second|seconds]
が想定されます。
詳細は、「範囲ベースのストリームからリレーションへのウィンドウ演算子」および「分割されたストリームからリレーションへのウィンドウ演算子」を参照してください。
構文については、time_spec::=(親: window_type::=)を参照してください。
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_where_clause::=(親: sfw_block::=)を参照してください。
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
句で集計関数の結果をテストする必要があります。
詳細は、次を参照してください。
構文については、opt_group_by_clause::=(親: sfw_block::=)を参照してください。
order_by_clause
1つ以上の並べ替え条件(「
orderterm」を参照)のカンマ区切りのリスト(「order_by_list」)として、Oracle CQL問合せ文のORDER BY句を指定します。ORDER
BY
句を使用して、ルールの左側のストリーム要素が評価される順序を指定します。expr
はディメンションまたはメジャー列に解決される必要があります。この句ではストリームが返されます。
ORDER BYとORDER BY ROWSのどちらでも、ソートの方向をASCまたはESCキーワードを使用して昇順または降順として指定できます。NULLS FIRSTまたはNULLS LASTを使用してソートする場合、null項目を最初または最後のどちらにリストするかも指定できます。
詳細は、次を参照してください。
構文については、order_by_clause::=(親: sfw_block::=)を参照してください。
order_by_top_clause
1つ以上の並べ替え条件(「
orderterm」を参照)のカンマ区切りのリスト(「order_by_list」)として、Oracle CQL問合せ文のORDER BY句を指定し、その後にROWS
キーワードと要素数の整数(n
)を指定します。この形式の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でサポートされている機能の詳細は、「order_by_clause::=」を参照してください。
詳細は、次を参照してください。
構文については、order_by_top_clause::=(親: sfw_block::=)を参照してください。
order_by_list
(オプションの)ORDER BY
句で、1つ以上の並べ替え条件(「orderterm」を参照)のカンマ区切りのリストを指定します。
構文については、order_by_list::=(親: order_by_clause::=)を参照してください。
orderterm
ストリーム要素(attr::=)またはストリーム要素の位置索引(定数int)。オプションで、NULLS
キーワードを使用して、nullを順序の最初または最後のどちらにするかを構成できます(「null_spec」を参照)。
order_expr(order_expr::=)にはattr
またはconstant_int
を指定できます。attr
(attr::=)には任意のストリーム要素または疑似列を指定できます。
構文については、orderterm::=(親: order_by_list::=)を参照してください。
null_spec
指定の並べ替え条件(「orderterm」を参照)でnullを順序の最初にするか(NULLS FIRST
)、または最後にするか(NULLS LAST
)を指定します。
構文については、null_spec::=(親: orderterm::=)を参照してください。
asc_desc
並べ替え条件が昇順(ASC
)または降順(DESC
)のどちらであるかを指定します。
構文については、asc_desc::=(親: orderterm::=)を参照してください。
opt_having_clause
HAVING
句を使用して、返されたストリーム要素のグループを、指定されたcondition
がTRUE
のグループに制限します。この句を省略すると、Oracle Event Processingではすべてのグループのサマリー結果が返されます。
GROUP
BY
と HAVING
はopt_where_clause
の後に指定します。GROUP
BY
とHAVING
の両方を指定する場合は、どちらの順序でも指定できます。
Oracle CQLではWHERE
句はGROUP BY
またはHAVING
の前に適用されるため、SELECT
句で集計関数を指定する場合、WHERE
句ではなくHAVING
句で集計関数の結果をテストする必要があります。
詳細は、次を参照してください。
例については、「HAVINGの例」を参照してください。
構文については、opt_having_clause::=(親: sfw_block::=)を参照してください。
binary
2つのストリームまたはビューで返されるタプルで演算を実行するには、binary
句を使用します。これらの多くでは、集合演算が実行され、オペランドとして2つのリレーションが返されます。ただし、UNION ALL演算子では、かわりに本来バインドされていない2つのストリームが返されます。
例については、次の項を参照してください。
構文については、binary::=(親: query::=)を参照してください。
idstream_clause
問合せに適用されるリレーションからストリームへのIStream
またはDStream
演算子を指定するには、idstream_clause
を使用します。
詳細は、1.1.4項「リレーションからストリームへの演算子」を参照してください。
構文については、idstream_clause::=(親: query::=)を参照してください。
using_clause
DIFFERENCE USING
句を使用すると、問合せのIStream
またはDStream
の差分を簡単に検出できます。
詳細は、20.2.10項「問合せ結果の差分の検出」を参照してください。
構文については、using_clause::=(親: query::=)を参照してください。
usinglist
usinglist
句を使用して、問合せのIStream
またはDStream
の差分検出に使用する列を指定します。次の項目によって列を指定できます。
属性名: 属性名で選択する場合に、このオプションを使用します。
例22-2は、DIFFERENCE USING
句のusinglist
の属性名c1
を示しています。
別名: 別名が指定されている式の結果を含める場合に、このオプションを使用します。
例22-2は、DIFFERENCE USING
句のusinglist
の別名logval
を示しています。
位置: 別名が指定されていない式の結果を含める場合に、このオプションを使用します。
位置は、左から右に読み取る、1で始まる正の整数の、定数として指定します。
例22-2では、式funct(c2, c3)
の結果を、DIFFERENCE USING
句のusinglist
で位置(3)によって示しています。
例22-2 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>
詳細は、20.2.10項「問合せ結果の差分の検出」を参照してください。
構文については、usinglist::=(親: using_clause::=)を参照してください。
xmltable_clause
XPathおよびXQueryを使用してxmltype
ストリーム要素を処理するには、xmltable_clause
を使用します。1つ以上のXML表列(xtbl_cols_list::=を参照)のカンマ区切りのリスト(xtbl_col::=を参照)を指定できます。
例については、次の項を参照してください。
構文については、xmltable_clause::=(親: relation_variable::=)を参照してください。
pattern_recognition_clause
データ・ストリーム用に最適化された高度な比較を実行するには、pattern_recognition_clause
を使用します。
詳細および例については、第21章「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。
構文については、pattern_recognition_clause::=(親: relation_variable::=)を参照してください。
例
次の例では、この文でサポートされる様々なセマンティクスを示します。
詳細は、第20章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
単純な問合せの例
例22-3に、ストリーム要素orderAmount
が10000を超える場合のすべての(*
)タプルをストリームOrderStream
から選択する単純な問合せq0
を登録する方法を示します。
例22-3 REGISTER QUERY
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
HAVINGの例
例22-4の問合せq4
と、例22-5のデータ・ストリームS2
があるとします。ストリームS2
のスキーマは(c1 integer, c2 integer)
です。この問合せは、例22-6に示すリレーションを返します。
例22-4 HAVINGの問合せ
<query id="q4"><![CDATA[ select c1, sum(c1) from S2[range 10] group by c1 having c1 > 0 and sum(c1) > 1 ]]></query>
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つのリレーションをオペランドとして使用することは、どちらの演算子でも無効です。
例22-8と例22-9のそれぞれのリレーションR1
とR2
を指定した場合、例22-7のUNION
問合せq1
では例22-10のリレーションが返され、例22-7のUNION ALL
問合せq2
では例22-11のリレーションが返されます。
リレーションのかわりにストリームを持つUNION ALLの例は、例22-12、例22-13および例22-14を参照してください。
例22-7 UNIONとUNION ALLの問合せ
<query id="q1"><![CDATA[ R1 UNION R2 ]]></query> <query id="q2"><![CDATA[ R1 UNION ALL R2 ]]></query>
例22-8 UNIONのリレーション入力R1
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
例22-9 UNIONのリレーション入力R2
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
例22-10 UNIONのリレーション出力
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
例22-11 UNION ALLのリレーション入力からの出力
次の出力は、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
例22-12 UNION ALLのストリーム入力S1
Timestamp Tuple 100000: 20,0.1 150000: 15,0.1 200000: 5,0.2 400000: 30,0.3 100000000: 8,4.04
例22-13 UNION ALLのストリーム入力S2
Timestamp Tuple 1001: 10,0.1 1002: 15,0.14 200000: 20,0.2 400000: 30,0.3 100000000: 40,4.04
例22-14 UNION ALLのストリーム入力からの出力
次の出力は、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つのリレーションを(重複を削除して)返します。
例22-16と例22-17のそれぞれのリレーションR1
とR2
を指定した場合、例22-15のINTERSECT
問合せq1
では例22-18のリレーションが返されます。
例22-16 INTERSECTのリレーション入力R1
Timestamp Tuple Kind Tuple 1000: + 10,30 1000: + 10,40 2000: + 11,20 3000: - 10,30 3000: - 10,40
例22-17 INTERSECTのリレーション入力R2
Timestamp Tuple Kind Tuple 1000: + 10,40 2000: + 10,30 2000: - 10,40 3000: - 10,30
例22-18 INTERSECTのリレーション出力
Timestamp Tuple Kind Tuple 1000: + 10,40 2000: + 10,30 2000: - 10,40 3000: - 10,30
BINARYの例: EXCEPTとMINUS
データベースのプログラミングと同様に、EXCEPT
演算子とMINUS
演算子は非常に似ています。どちらも2つのオペランドとしてリレーションを使用します。どちらも結果は、基本的に要素が1つ目のオペランド・リレーションの要素(2つ目のオペランド・リレーションには含まれていない)であるリレーションになります。
EXCEPT
とMINUS
の重要な違いは、次のように、1つ目と2つ目のリレーション・オペランドの間で発生する重複の処理方法にあります。
EXCEPT演算子の結果は、1つ目のリレーションの要素で構成されるリレーションになり、2つ目のリレーションでも検出された要素はその検出数まで削除されます。つまり、ある要素が1つ目のリレーションでm回発生し、2つ目のリレーションでn回発生する場合、結果におけるその要素の数はmからnを引いた数となり、nがmより多い場合は0になります。
MINUS演算子の結果は、1つ目のリレーションの要素から2つ目のリレーションでも検出された要素を引いた要素で構成され、それぞれのリレーションでそれらの要素がいくつ検出されたかは関係ありません。MINUS演算子では、1つ目のリレーションで検出された重複要素も削除されるため、各重複項目は結果では一意になります。
次の例では、MINUS演算子について説明しています。例22-20と例22-21のそれぞれのリレーションR1
とR2
を指定した場合、例22-19のMINUS
問合せq1
では例22-22のリレーションが返されます。
例22-20 MINUSのリレーション入力R1
Timestamp Tuple Kind Tuple 1500: + 10,40 1800: + 10,30 2000: + 10,40 2000: + 10,40 2100: - 10,40 3000: - 10,30
次の例では、EXCEPT演算子について説明しています。例22-24と例22-25のそれぞれのリレーションR1
とR2
を指定した場合、例22-23のEXCEPT
問合せq1
では例22-26のリレーションが返されます。
例22-24 EXCEPTのリレーション入力R1
Timestamp Tuple Kind Tuple 1500: + 10,40 1800: + 10,30 2000: + 10,40 2000: + 10,40 2100: - 10,40 3000: - 10,30
例22-26 EXCEPTのリレーション出力
Timestamp Tuple Kind Tuple 1500: + 10,40 1800: + 10,30 2000: + 10,40 2100: - 10,40
BINARYの例: INとNOT IN
この使用方法では、問合せはバイナリの問合せになります。
in_condition_set::=
例22-27のビューV3
とV4
および問合せQ1
、例22-28のデータ・ストリームS3
(スキーマ(c1 integer, c2 integer)
を持つ)、例22-29のS4
(スキーマ(c1 integer, c2 integer)
を持つ)があるとします。この条件テストでは、左のリレーションの属性の数およびデータ型は、右のリレーションの属性の数およびデータ型と同じである必要があります。例22-30は、問合せによって返されるリレーションを示しています。
例22-27 集合演算としてのINとNOT IN: 問合せ
<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>
例22-28 集合演算としてのINとNOT IN: ストリームS3入力
Timestamp Tuple 1000 10, 30 1000 10, 40 2000 11, 20 3000 12, 40 3000 12, 30 3000 15, 50 h 2000000
例22-30 集合演算としてのINとNOT IN: リレーション出力
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の例
例22-31の問合せq1
があるとします。例22-32のデータ・ストリームS
を指定した場合、問合せでは例22-33のリレーションが返されます。
例22-31 Select DISTINCTの問合せ
<query id="q1"><![CDATA[ SELECT DISTINCT FROM S WHERE c1 > 10 ]]></query>
例22-32 Select DISTINCTのストリーム入力
Timestamp Tuple 1000 23 2000 14 3000 13 5000 22 6000 11 7000 10 8000 9 10000 8 11000 7 12000 13 13000 14
XMLTABLEの問合せの例
例22-34の問合せq1
と、例22-35のデータ・ストリームS
があるとします。ストリームS
のスキーマは(c1 xmltype)
です。この問合せは、例22-36に示すリレーションを返します。
XMLTABLEの詳細は、20.2.6項「XMLTABLEの問合せ」を参照してください。
例22-34 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>
例22-35 XMLTABLEのストリーム入力
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>"
例22-36 XMLTABLEのリレーション出力
Timestamp Tuple Kind Tuple 3000: + <productName>Lawnmower</productName>,<quantity>1</quantity> 3000: + <productName>Baby Monitor</productName>,<quantity>1</quantity>
XMLネームスペースを使用するXMLTABLEの問合せの例
例22-37の問合せq1
と、例22-38のデータ・ストリームS1
があるとします。ストリームS1
のスキーマは(c1 xmltype)
です。この問合せは、例22-39に示すリレーションを返します。
XMLTABLEの詳細は、20.2.6項「XMLTABLEの問合せ」を参照してください。
例22-37 XMLネームスペースを使用する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>
例22-38 XMLネームスペースを使用するXMLTABLEのストリーム入力
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
例22-39 XMLネームスペースを使用するXMLTABLEのリレーション出力
Timestamp Tuple Kind Tuple 3000: + John,1 3000: + Jack,2 3000: + Jill,3
データ・カートリッジTABLEの問合せの例: イテレータ
例22-40に示す、メソッドMyCartridge
を持つデータ・カートリッジ(MyCartridge
)があるとします。
例22-40 メソッドgetIteratorのMyCartridge
... public static Iterator<Integer> getIterator() { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); return list.iterator(); } ...
例22-41の問合せq1
があるとします。例22-42のデータ・ストリームS0
を指定した場合、問合せでは例22-43のリレーションが返されます。
例22-41 TABLEの問合せ: イテレータ
<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>
例22-43 TABLEの問合せの出力: イテレータ
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の問合せの例: 配列
例22-44に示す、メソッドgetArray
を持つデータ・カートリッジ(MyCartridge
)があるとします。
例22-44 メソッド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]);; } ...
例22-45の問合せq1
があるとします。例22-46のデータ・ストリームS0
を指定した場合、問合せでは例22-47のリレーションが返されます。
例22-45 TABLEの問合せ: 配列
<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>
例22-47 TABLEの問合せの出力: 配列
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の問合せの例: コレクション
例22-48に示す、メソッドgetCollection
を持つデータ・カートリッジ(MyCartridge
)があるとします。
例22-48 メソッド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; } ...
例22-49の問合せq1
があるとします。例22-50のデータ・ストリームS0
を指定した場合、問合せでは例22-51のリレーションが返されます。
例22-49 TABLEの問合せ: コレクション
<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>
例22-51 TABLEの問合せの出力: コレクション
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は入力がストリームの場合のみ有効で、同じタイムスタンプのイベント間のソートのみ行います。その出力は、ソートされたイベントを持つストリームです。
詳細は、「order_by_clause::=」を参照してください。
例22-55の問合せq1
があるとします。例22-56のデータ・ストリームS0
を指定した場合、問合せでは例22-57のリレーションが返されます。この問合せでは、タイムスタンプが重複するイベントをタプル値により昇順でソートします。
例22-53 ORDER BYのストリーム入力
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
例22-54 ORDER BYのストリーム出力
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では、順序付け基準と指定行数を使用して、イベントを受信どおりに出力に加えるかどうかが決められます。
詳細は、「order_by_top_clause::=」を参照してください。
例22-55の問合せq1
があるとします。例22-56のデータ・ストリームS0
を指定した場合、問合せでは例22-57のリレーションが返されます。
例22-55 ORDER BY ROWSの問合せ
<query id="q1"><![CDATA[ SELECT c1 ,c2 FROM S0 ORDER BY c1,c2 ROWS 5 ]]></query>
例22-56 ORDER BY ROWSのストリーム入力
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
例22-57 ORDER BY ROWSの出力
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キーワードは、イベントが降順に並べられることを指定します。新しいイベントは、出力セット内にすでに存在するイベントの後にない場合、出力には含まれません。
例22-58 PARTITIONを指定したORDER BY ROWSの問合せ
<query id="q1"><![CDATA[ SELECT symbol, value FROM S0 ORDER BY value DESC ROWS 2 PARTITION BY symbol ]]></query>
例22-59 PARTITIONを指定したORDER BY ROWSの入力
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
例22-60 PARTITIONを指定したORDER BY ROWSの出力
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
目的
後続のOracle CQL文のidentifier
で参照される、基本のストリームまたはリレーションに対するビューを作成するには、view文を使用します。
要件
詳細は、次を参照してください。
構文
例22-61に示すように、<view></view>
要素でビューを表します。
view
要素は2つの属性を持ちます。
id
: view
要素のid
属性としてidentifier
を指定します。
id
値はidentifier::=で指定される仕様に準拠する必要があります。
schema
: オプションで、属性名のスペース区切りリストとしてviewのスキーマを指定します。
Oracle Event Processingサーバーではタイプが推測されます。
例22-61 <view></view>要素のビュー
<view id="v2" schema="cusip bid ask"><![CDATA[ IStream(select * from S1[range 10 slide 10]) ]]></view>
ビュー本体の構文は問合せと同じです。詳細は、「Query」を参照してください。
例
次の例では、この文でサポートされる様々なセマンティクスを示します。詳細は、第20章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
ビュー登録の例
例22-62に、ビューv2
を登録する方法を示します。