この章では、Oracle CEP でサポートされるさまざまな Oracle CQL データ定義言語 (DDL) とデータ操作言語 (DML) の文について説明します。
Oracle CQL では以下の DDL 文をサポートしています。
注意 : ストリーム入力の例で、h で始まる行 (h 3800 など) はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことを Oracle CEP に通知します。 |
詳細については、以下を参照してください。
目的
後続の Oracle CQL 文の identifier
で参照される Oracle CQL クエリを定義するには、query 文を使用します。
要件
クエリがストリームまたはビューを参照する場合は、ストリームまたはビューが存在している必要があります。
クエリがすでに存在している場合は、Oracle CEP サーバで例外が送出されます。
詳細については、以下を参照してください。
構文
例 16-1 に示すように、<query></query>
要素でクエリを表します。query
要素の id
属性として identifier
を指定します。
例 16-1 <query></query> 要素のクエリ
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
query::=
(sfw_block::=、xstream_clause::=、binary::=)
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::=
(identifier::=、window_type::=、pattern_recognition_clause::=、xmltable_clause::=)
window_type::=
(identifier::=、non_mt_attr_list::=)
(pattern_partition_clause::=、order_by_list::=)
orderterm::=
(order_expr::=、null_spec::=、asc_desc::=)
null_spec::=
asc_desc::=
binary::=
(const_string::=、xqryargs_list::=、xtbl_cols_list::=)
セマンティクス
named_query
Oracle CQL クエリ文自体を指定します (「query」を参照)。
USE UPDATE SEMANTICS
を使用してクエリをコンフィグレーションすることを検討している場合は、1 つ以上のストリーム要素をプライマリ キーとして宣言する必要があります (out_of_line_constraint::=)。
構文については、「Query」を参照してください。
query
Oracle CQL クエリは、以下の任意の句から作成できます。
sfw_block
: select、from、およびその他の省略可能な句 (「sfw_block」を参照)。
binary
: 省略可能な集合演算の句 (「binary」を参照)。
xstream_clause
: sfw_block
または binary
句に省略可能なリレーションからストリームへの演算子を適用して、クエリが結果を返す方法を制御します (「xstream_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」を参照)。
構文については、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
キーワードを使用してストリームまたはビューのエリアスを指定します。
詳細については、以下を参照してください。
構文については、relation_variable::= (親 : non_mt_relation_list::=) を参照してください。
window_type
組み込みのストリームからリレーションへの演算子を指定します。
詳細については、節 1.1.3「ストリームからリレーションへの演算子 (枠)」を参照してください。
構文については、window_type::= (親 : relation_variable::=) を参照してください。
time_spec
範囲または分割された範囲のスライド枠がスライドする時間を指定します。
デフォルト : 単位を指定しない場合、Oracle CEP では [second|seconds]
が想定されます。
詳細については、「範囲ベースのストリームからリレーションへの枠演算子」および「分割されたストリームからリレーションへの枠演算子」を参照してください。
構文については、time_spec::= (親 : window_type::=) を参照してください。
opt_where_clause
Oracle CQL クエリ文の (省略可能な) where 句を指定します。
構文については、opt_where_clause::= (親 : sfw_block::=) を参照してください。
opt_group_by_clause
Oracle CQL クエリ文の (省略可能な) GROUP BY
句を指定します。選択されたストリーム要素を expr
の値に基づいてグループ化し、各グループごとに単一の (集約) サマリ結果を返す場合は、GROUP
BY
句を使用します。
GROUP
BY
句の式には、ストリーム要素が select リストにあるかどうかにかかわらず、FROM
句の任意のストリーム要素またはビューを含めることができます。
GROUP
BY
句ではストリーム要素がグループ化されますが、結果セットの順序は保証されません。グループの並べ替えを行うには、ORDER
BY
句を使用します。
構文については、opt_group_by_clause::= (親 : sfw_block::=) を参照してください。
order_by_clause
1 つ以上の並べ替え条件 (「orderterm」を参照) のカンマ区切りのリスト (「order_by_list」) として、Oracle CQL クエリ文の ORDER BY
句を指定します。ORDER
BY
句を使用して、ルールの左側のストリーム要素が評価される順序を指定します。expr
はディメンションまたはメジャー列に解決される必要があります。
詳細については、節 14.2.6「クエリ結果のソート」を参照してください。
構文については、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_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 CEP ではすべてのグループのサマリ結果が返されます。
GROUP
BY
と HAVING
は opt_where_clause
の後に指定します。GROUP
BY
と HAVING
の両方を指定する場合は、どちらの順序でも指定できます。
例については、「HAVING の例」を参照してください。
構文については、opt_having_clause::= (親 : sfw_block::=) を参照してください。
binary
2 つのストリームまたはビューで返されるタプルの集合演算を実行するには、binary
句を使用します。
例については、以下を参照してください。
構文については、binary::= (親 : query::=) を参照してください。
xstream_clause
クエリに適用されるリレーションからストリームへの演算子を指定するには、xstream_clause
を使用します。
詳細については、節 1.1.4「リレーションからストリームへの演算子」を参照してください。
構文については、xstream_clause::= (親 : query::=) を参照してください。
xmltable_clause
XPath および XQuery を使用して xmltype
ストリーム要素を処理するには、xmltable_clause
を使用します。1 つ以上の XML テーブル列 (xtbl_col::= を参照) のカンマ区切りのリスト (xtbl_cols_list::= を参照) を指定できます。
例については、「XMLTABLE のクエリの例」を参照してください。
構文については、xmltable_clause::= (親 : relation_variable::=) を参照してください。
pattern_recognition_clause
データ ストリーム用に最適化された高度な比較を実行するには、pattern_recognition_clause
を使用します。
詳細および例については、第 15 章「MATCH_RECOGNIZE を使用したパターン認識」を参照してください。
構文については、pattern_recognition_clause::= (親 : relation_variable::=) を参照してください。
例
以下の例では、この文でサポートされるさまざまなセマンティクスを示します。
その他の例については、第 14 章「Oracle CQL のクエリ、ビュー、および結合」を参照してください。
単純なクエリの例
例 16-2 は、ストリーム要素 orderAmount
が 10000 を超える場合のすべての (*
) タプルをストリーム OrderStream
から選択する単純なクエリ q0
を登録する方法を示します。
例 16-2 クエリの登録
<query id="q0"><![CDATA[ select * from OrderStream where orderAmount > 10000.0 ]]></query>
HAVING の例
例 16-3 のクエリ q4
と例 16-4 のデータ ストリーム S2
があるとします。ストリーム S2
のスキーマは (c1 integer, c2 integer)
です。例 16-5 はクエリで返されるリレーションを示します。
例 16-3 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
例 16-7 と例 16-8 のリレーション R1
と R2
がそれぞれある場合、例 16-6 の UNION
クエリ q1
では例 16-9 のリレーションが返されます。例 16-6 の UNION ALL
クエリ q2
では例 16-10 のリレーションが返されます。
例 16-6 集合演算子 : UNION のクエリ
<query id="q1"><![CDATA[ R1 UNION R2 ]]></query> <query id="q2"><![CDATA[ R1 UNION ALL R2 ]]></query>
例 16-7 集合演算子 : 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
例 16-8 集合演算子 : 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
例 16-9 集合演算子 : 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
例 16-10 集合演算子 : UNION ALL のリレーション出力
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
BINARY の例 : INTERSECT
例 16-12 と例 16-13 のリレーション R1
と R2
がそれぞれある場合、例 16-11 の INTERSECT
クエリ q1
では例 16-14 のリレーションが返されます。
例 16-12 集合演算子 : INTERSECT のリレーション入力 R1
Timestamp Tuple Kind Tuple 1000: + 10,30 1000: + 10,40 2000: + 11,20 3000: - 10,30 3000: - 10,40
例 16-13 集合演算子 : INTERSECT のリレーション入力 R2
Timestamp Tuple Kind Tuple 1000: + 10,40 2000: + 10,30 2000: - 10,40 3000: - 10,30
例 16-14 集合演算子 : INTERSECT のリレーション出力
Timestamp Tuple Kind Tuple 1000: + 10,30 1000: + 10,40 1000: - 10,30 1000: - 10,40 1000: + 10,40 2000: + 11,20 2000: - 11,20 2000: + 10,30 2000: - 10,40 3000: - 10,30
BINARY の例 : MINUS
例 16-16 と例 16-17 のリレーション R1
と R2
がそれぞれある場合、例 16-15 の MINUS
クエリ q1
では例 16-18 のリレーションが返されます。
例 16-16 集合演算子 : MINUS のリレーション入力 R1
Timestamp Tuple Kind Tuple 1500: + 10,40 2000: + 10,30 2000: - 10,40 3000: - 10,30
例 16-17 集合演算子 : MINUS のリレーション入力 R2
Timestamp Tuple Kind Tuple 1000: + 11,20 2000: + 10,40 3000: - 10,30
Select と Distinct の例
例 16-19 のクエリ q1
があるとします。例 16-20 のデータ ストリーム S
がある場合、クエリでは例 16-21 のリレーションが返されます。
例 16-19 Select DISTINCT のクエリ
<query id="q1"><![CDATA[ SELECT DISTINCT FROM S WHERE c1 > 10 ]]></query>
例 16-20 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 のクエリの例
例 16-22 のクエリ q1
と例 16-23 のデータ ストリーム S
があるとします。ストリーム S
のスキーマは (c1 xmltype)
です。例 16-24 はクエリで返されるリレーションを示します。詳細については、節 14.2.5「XMLTable のクエリ」を参照してください。
例 16-22 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>
例 16-23 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>"
例 16-24 XMLTABLE のリレーション出力
Timestamp Tuple Kind Tuple 3000: + <productName>Lawnmower</productName>,<quantity>1</quantity> 3000: + <productName>Baby Monitor</productName>,<quantity>1</quantity>
ORDER BY ROWS のクエリの例
例 16-25 のクエリ q1
があるとします。例 16-26 のデータ ストリーム S0
がある場合、クエリでは例 16-27 のリレーションが返されます。
例 16-25 ORDER BY ROWS のクエリ
<query id="q1"><![CDATA[ create query q1 as select c1 ,c2 from S0 order by c1,c2 rows 5 ]]></query>
目的
後続の Oracle CQL 文の identifier
で参照される、基本のストリームまたはリレーションに対するビューを作成するには、view 文を使用します。
要件
詳細については、以下を参照してください。
構文
例 16-28 に示すように、<view></view>
要素でビューを表します。view
要素の id
属性として identifier
を指定します。オプションで、view
要素の schema
属性としてスキーマを指定します。
例 16-28 <view></view> 要素のビュー
<view id="v2" schema="cusip bid ask"><![CDATA[ IStream(select * from S1[range 10 slide 10]) ]]></view>
ビュー本体の構文はクエリと同じです。詳細については、「Query」を参照してください。
例
以下の例では、この文でサポートされるさまざまなセマンティクスを示します。その他の例については、第 14 章「Oracle CQL のクエリ、ビュー、および結合」を参照してください。
ビュー登録の例
例 16-29 はビュー v2
を登録する方法を示します。