Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス 12c リリース(12.1.3) E57533-04 |
|
![]() 前へ |
![]() 次へ |
この章では、Oracle Continuous Query Language (Oracle CQL)の演算子のリファレンスを提供します。演算子は、データ項目を操作して結果を返します。構文では、演算子はオペランドの前後または2つのオペランドの間で使用します。
この章の内容は次のとおりです。
演算子は、オペランドまたは引数と呼ばれる個々のデータ項目を操作します。演算子は特殊文字またはキーワードで表します。たとえば、乗算演算子はアスタリスク(*
)で表します。
Oracle CQLには次の演算子が用意されています。
演算子は通常、次の2つに分類されます。
単項: 単項演算子は1つのオペランドのみを操作します。単項演算子は通常、オペランドとともに次の形式で使用します。
operator operand
バイナリ: 二項演算子は2つのオペランドを操作します。二項演算子は通常、オペランドとともに次の形式で使用します。
operand1 operator operand2
特殊な形式を持つ他の演算子では3つ以上のオペランドを使用できます。オペランドにnullが指定された場合、結果は常にnullになります。この規則に従わない唯一の演算子は、連結(||)です。
優先順位とは、Oracle Event Processingによって同じ式の異なる演算子が評価される順序です。複数の演算子を含む式を評価する場合、Oracle Event Processingでは優先順位の高い演算子が優先順位の低い演算子よりも先に評価されます。Oracle Event Processingでは、優先順位の等しい演算子は式の左から右に評価されます。
表4-1は、Oracle CQL演算子の優先順位レベルを高い順に示しています。同じ行にある演算子の優先順位は同じです。
表4-1 Oracle CQL演算子の優先順位
|
優先順位の例
次の式では、乗算は加算よりも優先順位が高いため、2と3を掛けた結果に1が加算されます。
1+2*3
式の中でカッコを使用すると、演算子の優先順位をオーバーライドできます。カッコ内の式がカッコ外の式よりも先に評価されます。
表4-2は、Oracle Event Processingでサポートされる算術演算子を示しています。算術演算子を1つまたは2つの引数とともに使用して、数値を否定、加算、減算、乗算および除算できます。これらの演算子の一部は日時と期間の算術演算でも使用されます。演算子の引数は、数値データ型または数値データ型に暗黙的に変換できる任意のデータ型に解決される必要があります。
特定のケースでは、Oracle Event Processingによって、引数が演算に必要なデータ型に変換されます。たとえば、整数と浮動小数点数を加算する場合は、整数の引数が浮動小数点数に変換されます。結果の式のデータ型は浮動小数点数です。詳細は、「暗黙的なデータ型変換」を参照してください。
表4-2 算術演算子
|
連結演算子は文字列を操作します。表4-3に、連結演算子を示します。
表4-3 連結演算子
|
2つの文字列を連結した結果は別の文字列になります。文字列のデータ型が両方ともCHAR
の場合、結果のデータ型はCHAR
であり、2000字に制限されます。文字列のデータ型にかかわらず、連結では文字列末尾の空白が維持されます。
Oracle Event Processingでは、長さ0の文字列はnullとして扱われますが、長さ0の文字列と別のオペランドとの連結の結果は常にその別のオペランドになるため、結果がnullになるのは2つのnull文字列が連結された場合にかぎられます。ただし、Oracle Event Processingの将来のバージョンでは、これが変更される可能性があります。nullになる可能性のある式を連結する場合は、NVL
関数を使用してその式を長さ0の文字列に明示的に変換してください。
次の例に、連結演算子を使用して文字列「xyz」をselect文のc2
の値に付加する方法を示します。
<query id="q264"><![CDATA[ select c2 || "xyz" from S10 ]]></query>
二者択一演算子を使用して、PATTERN
句の意味を調整できます。表4-4は、連結演算子を示しています。
表4-4 二者択一演算子
|
二者択一演算子は、PATTERN
句内のみに適用可能です。
次の例に、二者択一演算子を使用して、PATTERN
句が「1回以上のAの後にBが1回以上、またはCが1回以上、いずれか先に来る方が続く」という意味になるように定義する方法を示します。
<query id="q264"><![CDATA[ select T.p1, T.p2, T.p3 from S MATCH_RECOGNIZE( MEASURES A.ELEMENT_TIME as p1, B.ELEMENT_TIME as p2 B.c2 as p3 PATTERN (A+ (B+ | C+)) DEFINE A as A.c1 = 10, B as B.c1 = 20 C as C.c1 = 30 ) as T ]]></query>
詳細は、「PATTERN句内でのグループ化および二者択一」を参照してください。
Oracle CQLでは、次の範囲ベースのストリームからリレーションへのウィンドウ演算子がサポートされています。
注意:
非常に大きな数には接尾辞を付ける必要があります。接頭辞がない場合、Javaでは、非常に大きな数が整数として処理され、値が整数の範囲から外れる可能性があります。この場合、エラーがスローされます。
接頭辞は次のように追加します。
LongにはlまたはL
floatにはfまたはF
doubleにはdまたはD
big decimalにはnまたはN
次に例を示します。
SELECT * FROM channel0[RANGE 1368430107027000000l nanoseconds]
window_type_range::=
この時間ベースの範囲ウィンドウでは瞬間的なリレーションが出力されます。このため、時間t
のnow
ウィンドウの出力は、その瞬間t
に到着したすべてのタプルになります。Oracle Event Processingの時間の最小単位はナノ秒であるため、これらのすべてのタプルは1ナノ秒後に期限切れになります。
例については、「S [now]の例」を参照してください。
S[now]の例
問合せとデータ・ストリームS
があるとします。タイムスタンプはナノ秒(1 sec = 10^9 nanoseconds
)で示されています。次の例は、時間5000 ms
で問合せが返すリレーションを示しています。時間5002 ms
には空のリレーションが返されます。
<query id="q1"><![CDATA[ SELECT * FROM S [now] ]]></query>
Timestamp Tuple 1000000000 10,0.1 1002000000 15,0.14 5000000000 33,4.4 5000000000 23,56.33 10000000000 34,4.4 200000000000 20,0.2 209000000000 45,23.44 400000000000 30,0.3 h 800000000000
Timestamp Tuple Kind Tuple 5000000000 + 33,4.4 5000000000 + 23,56.33 5000000001 - 33,4.4 5000000001 - 23,56.33
この時間ベースの範囲ウィンドウでは、サイズT
の時間単位の間隔をスライドさせ、並べられたストリームの最新部分を取得することで、時間の経過に沿った出力リレーションが定義されます。
例については、「S [range T]の例」を参照してください。
S [range T]の例
問合せq1
について考えてみます。データ・ストリームS
の場合、問合せはリレーションを返します。デフォルトでは、範囲の時間単位はsecond
であるため、S[range 1]
はS[range 1 second]
と同等です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。最初の1000 ms
の間隔に存在している要素、つまりタプル(10,0.1)
がウィンドウに入ります。時間1002 ms
には、タプル(15,0.14)
がウィンドウに入ります。時間2000 ms
には、この間隔よりも長い間ウィンドウに留まっていたタプル、つまりタプル(10,0.1)
がリレーションから削除の対象になります。この時間、タプル(15,0.14)
はまだリレーションに含まれます。時間2002 ms
には、タプル(15,0.14)
が、ウィンドウに留まっていた期間がその時点で1000 ms
を超えたため、削除の対象になります。
注意:
ストリーム入力の例で、h
で始まる行(h 3800
など)はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことをOracle Event Processingに通知します。
<query id="q1"><![CDATA[ SELECT * FROM S [range 1] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 200000 20,0.2 400000 30,0.3 h 800000 100000000 40,4.04 h 200000000
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 2000: - 10,0.1 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
この時間ベースの範囲ウィンドウでは、過去のタプルを維持する必要のある期間(範囲)と、タプルの出力を表示する頻度(スライド)を指定できます。
タプルがt
で表される時刻に到着するとします。スライド値をT2
で表すとすると、タプルは表示され、次のタイムスタンプのいずれかに送られて出力されます。
t
: タイムスタンプt
がスライドT2
の倍数の場合
Math.ceil(t/T2)*T2
: タイムスタンプがスライドT2
の倍数でない場合
範囲値をT1
で表すとすると、タイムスタンプt
で到着するタプルは、タイムスタンプt + T1
で期限が切れます。ただし、スライドが指定されていて、その値がゼロ以外の値の場合、期限切れのタプルは、必ずしもタイムスタンプt + T1
で出力されません。
期限切れのタプル(期限切れタイムスタンプはt + T1
)は、次のタイムスタンプのいずれかで表示されます。
(t + T1)
: タイムスタンプ(t+T1)
がスライドT2
の倍数の場合。
Math.ceil((t+T1)/T2)*T2
: タイムスタンプ(t+T1)
がスライドT2
の倍数でない場合。
例については、「S [range T1 slide T2]の例」を参照してください。
S [range T1 slide T2]の例
問合せq1
について考えてみます。データ・ストリームS
の場合、問合せはリレーションを返します。デフォルトでは、範囲の時間単位はsecond
であるため、S[range 10 slide 5]
はS[range 10 seconds slide 5 seconds]
と同等です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。スライド値は5 sec
であり、これはユーザーが5 sec
ごとに出力の表示を確認することを意味するため、1000
、1002
および5000
に到着したすべてのタプルは5000
の時点でウィンドウに入ります。これらのタプルは5 sec=5000 ms
にウィンドウに入りますが、範囲値は10 sec = 10000 ms
であるため、15000 ms
に期限切れになります。
<query id="q1"><![CDATA[ SELECT * FROM S [range 10 slide 5] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 5000 33,4.4 8000 23,56.33 10000 34,4.4 200000 20,0.2 209000 45,23.44 400000 30,0.3 h 800000
Timestamp Tuple Kind Tuple 5000: + 10,0.1 5000: + 15,0.14 5000: + 33,4.4 10000: + 23,56.33 10000: + 34,4.4 15000: - 10,0.1 15000: - 15,0.14 15000: - 33,4.4 20000: - 23,56.33 20000: - 34,44.4 200000: + 20,0.2 210000: - 20,0.2 210000: + 45,23.44 220000: - 45,23.44 400000: + 30,0.3 410000: - 30,0.3
この時間ベースの範囲ウィンドウでは、T = infinity
である場合に、時間t
のリレーションが時間t
までのS
のすべての要素から取得されたタプルで構成されるように、出力リレーションが定義されます。要素はウィンドウ内で無限に維持されます。
例については、「S [range unbounded]の例」を参照してください。
S [range unbounded]の例
問合せq1
とデータ・ストリームがあるとします。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。要素は到着した時点でリレーションに挿入されます。どの要素も削除されません。次の例は、時間5000 ms
に問合せで返されるリレーションと、時間205000 ms
に問合せで返されるリレーションを示します。
<query id="q1"><![CDATA[ SELECT * FROM S [range unbounded] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 5000 33,4.4 8000 23,56.33 10000 34,4.4 200000 20,0.2 209000 45,23.44 400000 30,0.3 h 800000
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 5000: + 33,4.4
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 5000: + 33,4.4 8000: + 23,56.33 10000: + 34,4.4 200000: + 20,0.2
この定数値ベースの範囲ウィンドウでは、ストリーム要素E
の値の差がC
未満のタプルから成る、識別子E
に基づいて並べられたストリームの最新部分を取得することで、出力リレーションが定義されます。ストリーム要素E
の値とリレーションの任意のタプルの値の差がC
以上の場合、タプルは削除の対象になります。
例については、次の項を参照してください。
S [range C on E]の例: 定数値
問合せtkdata56_q0
とデータ・ストリームtkdata56_S0
があるとします。ストリームtkdata56_S0
のスキーマは(c1 integer, c2 float)
です。次の例は、問合せが返すリレーションを示しています。この例では、時間200000の出力リレーションには次のタプルが含まれています: (5,0.1)
、(8,0.14)
、(10,0.2)
。これらの各タプルのc1
値の差は10未満です。時間250000にタプル(15,0.2)
が追加されると、タプル(5,0.1)
は差が15 - 5 = 10であり10未満でないため、削除対象になります。15 - 8 = 7は10未満であるため、タプル(8,0.14)
は留まります。同様に、15 - 10 = 5も10未満であるため、タプル(10,0.2)
は留まります。時間300000にタプル(18,0.22)
が追加されると、タプル(8,0.14)
は差が18 - 8 = 10であり10未満でないため、削除対象になります。
<query id="tkdata56_q0"><![CDATA[ select * from tkdata56_S0 [range 10 on c1] ]]></query>
Timestamp Tuple 100000 5, 0.1 150000 8, 0.14 200000 10, 0.2 250000 15, 0.2 300000 18, 0.22 350000 20, 0.25 400000 30, 0.3 600000 40, 0.4 650000 45, 0.5 700000 50, 0.6 1000000 58, 4.04
Timestamp Tuple Kind Tuple 100000: + 5,0.1 150000: + 8,0.14 200000: + 10,0.2 250000: - 5,0.1 250000: + 15,0.2 300000: - 8,0.14 300000: + 18,0.22 350000: - 10,0.2 350000: + 20,0.25 400000: - 15,0.2 400000: - 18,0.22 400000: - 20,0.25 400000: + 30,0.3 600000: - 30,0.3 600000: + 40,0.4 650000: + 45,0.5 700000: - 40,0.4 700000: + 50,0.6 1000000: - 45,0.5 1000000: + 58,4.04
S [range C on E]の例: INTERVALとTIMESTAMP
同様に、S[range C on ID]
ウィンドウではINTERVAL
とTIMESTAMP
を使用できます。問合せtkdata56_q2
とデータ・ストリームtkdata56_S1
があるとします。ストリームtkdata56_S1
のスキーマは(c1 timestamp, c2 double)
です。次の例は、問合せが返すリレーションを示しています。
<query id="tkdata56_q2"><![CDATA[ select * from tkdata56_S1 [range INTERVAL "530 0:0:0.0" DAY TO SECOND on c1] ]]></query>
Timestamp Tuple 10 "08/07/2004 11:13:48", 11.13 2000 "08/07/2005 12:13:48", 12.15 3400 "08/07/2006 10:15:58", 22.25 4700 "08/07/2007 10:10:08", 32.35
Timestamp Tuple Kind Tuple 10: + 08/07/2004 11:13:48,11.13 2000: + 08/07/2005 12:13:48,12.15 3400: - 08/07/2004 11:13:48,11.13 3400: + 08/07/2006 10:15:58,22.25 4700: - 08/07/2005 12:13:48,12.15 4700: + 08/07/2007 10:10:08,32.35
Oracle CQLでは、次のタプルベースのストリームからリレーションへのウィンドウ演算子がサポートされています。
window_type_tuple::=
タプルベースのウィンドウでは、並べられたストリームの最後のN
タプルのウィンドウをスライドさせることで、時間の経過に沿った出力リレーションが定義されます。
S [rows N]
の出力リレーションR
の場合、時間t
のリレーションは、大きいタイムスタンプ(<= t
)を持つS
のN
個のタプル(または、t
までのS
の長さが<= N
の場合はすべてのタプル)で構成されます。
同じタイムスタンプを持つ複数のタプルがある場合は、N
個のタプルが返されることを保証するため、Oracle Event Processingによって確定的でない方法で1つのタプルが選択されます。このため、タプルベースのウィンドウはタイムスタンプが一意でないストリームには適していない場合があります。
デフォルトでは、スライドは1です。
例については、「S [rows N]の例」を参照してください。
S [rows N]の例
問合せq1
とデータ・ストリームS
があるとします。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。要素はS [Range 1]
の場合と同様に挿入および削除されます(「S [range T]の例」を参照)。
次の例は、時間1002 ms
で問合せが返すリレーションを示しています。この時点のS
の長さはrows
値(3)以下であるため、その時点までに挿入されたS
のすべてのタプル、つまりタプル(10,0.1)
および(15,0.14)
が問合せで返されます。
次の例は、時間1006 ms
で問合せが返すリレーションを示しています。この時点のS
の長さはrows
値(3)を超えているため、1006 ms
以下の大きいタイムスタンプを持つS
の3つのタプル、つまりタプル(15,0.14)
、(33,4.4)
および(23,56.33)
が問合せで返されます。
次の例は、時間2000 ms
で問合せが返すリレーションを示しています。この時点で2000 ms以下の大きいタイムスタンプを持つSの3つのタプル、つまりタプル(45,23.44)、(30,0.3)および(17,1.3)が問合せで返されます。
<query id="q1"><![CDATA[ SELECT * FROM S [rows 3] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 1004 33,4.4 1006 23,56.33 1008 34,4.4 1010 20,0.2 1012 45,23.44 1014 30,0.3 2000 17,1.3
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 1004: + 33,4.4 1006: - 10,0.1 1006: + 23,56.33
Timestamp Tuple Kind Tuple 1000 + 10,0.1 1002 + 15,0.14 1004 + 33,4.4 1006 - 10,0.1 1006 + 23,56.33 1008 - 15,0.14 1008 + 34,4.4 1008 - 33,4.4 1010 + 20,0.2 1010 - 23,56.33 1012 + 45,23.44 1012 - 34,4.4 1014 + 30,0.3 2000 - 20,0.2 2000 + 17,1.3
タプルベースのウィンドウでは、並べられたストリームの最後のN1
タプルのウィンドウをスライドさせることで、時間の経過に沿った出力リレーションが定義されます。
S [rows N1 slide N2]
の出力リレーションR
の場合、時間t
のリレーションは、大きいタイムスタンプ(<= t
)を持つS
のN1
個のタプル(または、t
までのS
の長さが<= N
の場合はすべてのタプル)で構成されます。
同じタイムスタンプを持つ複数のタプルがある場合は、N
個のタプルが返されることを保証するため、Oracle Event Processingによって確定的でない方法で1つのタプルが選択されます。このため、タプルベースのウィンドウはタイムスタンプが一意でないストリームには適していない場合があります。
整数のストリーム要素数としてスライドN2
を構成できます。Oracle Event ProcessingではN2
個の要素を受け取るまで、リレーションへの要素の追加が遅れます。
例については、「S [rows N]の例」を参照してください。
S [rows N1 slide N2]の例
問合せtkdata55_q0
とデータ・ストリームtkdata55_S55
があるとします。ストリームtkdata55_S55
のスキーマは(c1 integer, c2 float)
です。
時間100000では、タプル(20,0.1)
のみがストリームに到着しているため、出力リレーションは空です。時間150000までに、slide
値の指定する数(2)のタプルが到着します。この時点で、出力リレーションにはタプル(20,0.1)
と(15,0.14)
が含まれます。時間250000までに、さらにslide
数のタプルが到着し、出力リレーションにはタプル(20,0.1)
、(15,0.14)
、(5,0.2)
および(8,0.2)
が含まれます。時間350000までに、さらにslide数のタプルが到着します。この時点で、最も古いタプル(20,0.1)
は、rows
値による制約を満たすために削除されます。つまり、出力リレーションには5以下の要素のみを含むことができるという制約です。この時点で、出力リレーションにはタプル(15,0.14)
、(5,0.2)
、(8,0.2)
、(10,0.22)
および(20,0.25)
が含まれます。時間600000で、さらにslide
数のタプルが到着します。この時点で、最も古いタプル(15,0.14)
と(5,0.2)
は、rows
値の制約を満たすために削除されます。この時点で、出力リレーションにはタプル(8,0.2)
、(10,0.22)
、(20,0.25)
、(30,0.3)
および(40,0.4)
が含まれます。
<query id="tkdata55_q0"><![CDATA[ select * from tkdata55_S55 [rows 5 slide 2 ] ]]></query>
Timestamp Tuple 100000 20, 0.1 150000 15, 0.14 200000 5, 0.2 250000 8, 0.2 300000 10, 0.22 350000 20, 0.25 400000 30, 0.3 600000 40, 0.4 650000 45, 0.5 700000 50, 0.6 100000000 8, 4.04
Timestamp Tuple Kind Tuple 150000: + 20,0.1 150000: + 15,0.14 250000: + 5,0.2 250000: + 8,0.2 350000: - 20,0.1 350000: + 10,0.22 350000: + 20,0.25 600000: - 15,0.14 600000: - 5,0.2 600000: + 30,0.3 600000: + 40,0.4 700000: - 8,0.2 700000: - 10,0.22 700000: + 45,0.5 700000: + 50,0.6
Oracle CQLでは、次の分割されたストリームからリレーションへのウィンドウ演算子がサポートされています。
window_type_partition::=
ストリームS
に対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数N
とストリーム属性のサブセット{A1,... Ak}
をパラメータとして受け取り、次のことを行います。
属性A1,... Ak
の同一性に基づいて、S
を異なるサブストリームに論理的に分割します(SQL GROUP BY
と同様)。
各サブストリームで、サイズN
のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N]の例」を参照してください。
S[partition by A1, ..., Ak rows N]の例
問合せqPart_row2
とデータ・ストリームSP1
があるとします。ストリームSP1
のスキーマは(c1 integer, name char(10))
です。この問合せはリレーションを返します。デフォルトでは、範囲(およびスライド)は1秒です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。
注意:
ストリーム入力の例で、h
で始まる行(h 3800
など)はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことをOracle Event Processingに通知します。
<query id="qPart_row2"><![CDATA[ select * from SP1 [partition by c1 rows 2] ]]></query>
Timestamp Tuple 1000 1,abc 1100 2,abc 1200 3,abc 2000 1,def 2100 2,def 2200 3,def 3000 1,ghi 3100 2,ghi 3200 3,ghi h 3800 4000 1,jkl 4100 2,jkl 4200 3,jkl 5000 1,mno 5100 2,mno 5200 3,mno h 12000 h 200000000
Timestamp Tuple Kind Tuple 1000: + 1,abc 1100: + 2,abc 1200: + 3,abc 2000: + 1,def 2100: + 2,def 2200: + 3,def 3000: - 1,abc 3000: + 1,ghi 3100: - 2,abc 3100: + 2,ghi 3200: - 3,abc 3200: + 3,ghi 4000: - 1,def 4000: + 1,jkl 4100: - 2,def 4100: + 2,jkl 4200: - 3,def 4200: + 3,jkl 5000: - 1,ghi 5000: + 1,mno 5100: - 2,ghi 5100: + 2,mno 5200: - 3,ghi 5200: + 3,mno
ストリームS
に対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数N
とストリーム属性のサブセット{A1,... Ak}
をパラメータとして受け取り、次のことを行います。
属性A1,... Ak
の同一性に基づいて、S
を異なるサブストリームに論理的に分割します(SQL GROUP BY
と同様)。
各サブストリームで、サイズN
および範囲T
のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N range T]の例」を参照してください。
S[partition by A1, ..., Ak rows N range T]の例
問合せqPart_range2
とデータ・ストリームSP5
があるとします。ストリームSP5
のスキーマは(c1 integer, name char(10))
です。この問合せはリレーションを返します。デフォルトでは、範囲の時間単位はsecond
であるため、range 2
はrange 2 seconds
と同等です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。
<query id="qPart_range2"><![CDATA[ select * from SP5 [partition by c1 rows 2 range 2] ]]></query>
Timestamp Tuple 1000 1,abc 2000 1,abc 3000 1,abc 4000 1,abc 5000 1,def 6000 1,xxx h 200000000
Timestamp Tuple Kind Tuple 1000: + 1,abc 2000: + 1,abc 3000: - 1,abc 3000: + 1,abc 4000: - 1,abc 4000: + 1,abc 5000: - 1,abc 5000: + 1,def 6000: - 1,abc 6000: + 1,xxx 7000: - 1,def 8000: - 1,xxx
ストリームS
に対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数N
とストリーム属性のサブセット{A1,... Ak}
をパラメータとして受け取り、次のことを行います。
属性A1,... Ak
の同一性に基づいて、S
を異なるサブストリームに論理的に分割します(SQL GROUP BY
と同様)。
各サブストリームで、サイズN
、範囲T1
およびスライドT2
のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N]の例」を参照してください。
S[partition by A1, ..., Ak rows N range T1 slide T2]の例
問合せqPart_rangeslide
とデータ・ストリームSP1
があるとします。ストリームSP1
のスキーマは(c1 integer, name char(10))
です。この問合せはリレーションを返します。デフォルトでは、範囲とスライドの時間単位はsecond
であるため、range 1 slide 1
はrange 1 second slide 1 second
と同等です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。
<query id="qPart_rangeslide"><![CDATA[ select * from SP1 [partition by c1 rows 1 range 1 slide 1] ]]></query>
Timestamp Tuple 1000 1,abc 1100 2,abc 1200 3,abc 2000 1,def 2100 2,def 2200 3,def 3000 1,ghi 3100 2,ghi 3200 3,ghi h 3800 4000 1,jkl 4100 2,jkl 4200 3,jkl 5000 1,mno 5100 2,mno 5200 3,mno h 12000 h 200000000
Timestamp Tuple Kind Tuple 1000: + 1,abc 2000: + 2,abc 2000: + 3,abc 2000: - 1,abc 2000: + 1,def 3000: - 2,abc 3000: + 2,def 3000: - 3,abc 3000: + 3,def 3000: - 1,def 3000: + 1,ghi 4000: - 2,def 4000: + 2,ghi 4000: - 3,def 4000: + 3,ghi 4000: - 1,ghi 4000: + 1,jkl 5000: - 2,ghi 5000: + 2,jkl 5000: - 3,ghi 5000: + 3,jkl 5000: - 1,jkl 5000: + 1,mno 6000: - 2,jkl 6000: + 2,mno 6000: - 3,jkl 6000: + 3,mno 6000: - 1,mno 7000: - 2,mno 7000: - 3,mno
Oracle Event Processingには組込みのストリームからリレーションへの演算子が用意されていますが、Javaでユーザー定義の(または拡張可能な)ウィンドウを作成することで、それよりも高度な(またはアプリケーション固有の)ストリームからリレーションへの演算子を作成できます。ユーザー定義のウィンドウは、組込みのストリームからリレーションへのウィンドウ演算子を使用できる場所であれば、Oracle CQL文の任意の場所で使用できます。
注意:
また、ユーザー定義関数を作成することもできます(「ユーザー定義関数」を参照)。
リレーションR
へ適用されるIstream
(「ストリームの挿入」の略)には、タプルs
がR(t) - R(t-1)
の中にある場合、つまりs
がt
の時点でR
へ挿入される場合は常に(s,t)
が含まれます。同じタイムスタンプでタプルの挿入と削除の両方が発生した場合、Istream
では挿入が出力されません。
now
ウィンドウによってviewq3
がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへのIStream
演算子によって、フィルタ出力がストリームに変換されます。
<query id="q3Txns"><![CDATA[ Istream( select TxnId, ValidLoopCashForeignTxn.ACCT_INTRL_ID, TRXN_BASE_AM, ADDR_CNTRY_CD, TRXN_LOC_ADDR_SEQ_ID from viewq3[NOW], ValidLoopCashForeignTxn where viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID ) ]]></query>
Istream
演算子とDIFFERENCES USING
句を組み合せて、Istream
の差分を簡単に検出できます。
詳細は、次を参照してください。
リレーションR
に適用されるDStream
(Delete stream
の略)には、タプルs
がR(t-1) - R(t)
の中にある場合、つまりt
の時点でs
がR
から削除される場合は常に(s,t)
が含まれます。同じタイムスタンプでタプルの挿入と削除の両方が発生した場合、Istreamでは挿入が出力されません。
次の例では、問合せによってストリームS
の入力が10分遅延されます。ストリームS
はrangeウィンドウ演算子によってリレーションに変換されますが、Dstream
によってストリームに戻されます。
<query id="BBAQuery"><![CDATA[ Dstream(select * from S[range 10 minutes]) ]]></query>
時間の最小単位を分と想定します。表4-5は、次の入力ストリームTradeInputs
の入力について、rangeウィンドウ演算子のリレーション(S[Range 10 minutes]
)とDstream
のストリームのコンテンツを示しています。
Time Value 05 1,1 25 2,2 50 3,3
表4-5 DStreamの出力例
|
時間15、35および60の時点で、リレーションは空{}
です(空のセット)。
Dstream
演算子とDIFFERENCES USING
句を組み合せて、Dstream
の差分を簡単に検出できます。
詳細は、次を参照してください。
Rstream
演算子は、入力リレーションの現在の状態全体を維持し、各時間ステップごとにすべてのタプルを挿入として出力します。
Rstream
では各瞬間のリレーション全体の状態が出力されるため、リレーション・セットが非常に小さい場合を除き、コストがかかる可能性があります。
次の例では、Rstream
によって時間Now
のwhere
句でフィルタ処理されたリレーション全体の状態が出力されます。
<query id="rstreamQuery"><![CDATA[ Rstream( select cars.car_id, SegToll.toll from CarSegEntryStr[now] as cars, SegToll where (cars.exp_way = SegToll.exp_way and cars.lane = SegToll.lane and cars.dir = SegToll.dir and cars.seg = SegToll.seg) ) ]]></query>