ヘッダーをスキップ
Oracle® CEP CQL 言語リファレンス
11g リリース 1 (11.1.1)
B55504-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4 演算子

演算子はデータ項目を操作し、結果を返します。構文上、演算子はオペランドの前後、または 2 つのオペランドの間に置かれます。

4.1 演算子の概要

演算子は、オペランドまたは引数と呼ばれる個別のデータ項目を操作します。演算子は特殊文字またはキーワードで表されます。たとえば、乗算演算子はアスタリスク (*) で表されます。

Oracle CQL には以下の演算子が用意されています。

4.1.1 単項演算子と二項演算子について

演算子は通常、以下の 2 つに分類されます。

  • 単項 : 単項演算子は 1 つのオペランドのみを操作します。単項演算子は通常、オペランドと共に以下の形式で使用します。

    operator operand
    
  • 二項 : 二項演算子は 2 つのオペランドを操作します。二項演算子はオペランドと共に以下の形式で使用します。

    operand1 operator operand2
    

特殊な形式を持つ他の演算子では 3 つ以上のオペランドを使用できます。オペランドに null が指定された場合、結果は常に null になります。この規則に従わない唯一の演算子は、連結 (||) です。

4.1.2 演算子の優先順位について

優先順位とは、Oracle CEP によって同一の式の異なる演算子が評価される順序です。複数の演算子を含む式を評価する場合、Oracle CEP では優先順位の高い演算子が優先順位の低い演算子よりも先に評価されます。優先順位の等しい演算子は式の左から右に評価されます。

表 4-1 は、Oracle CQL 演算子の優先順位レベルを高い順に示しています。同じ行にある演算子の優先順位は同じです。

表 4-1 Oracle CQL 演算子の優先順位

演算子 演算

+, - (単項演算子)

同一、否定

*, /

乗算、除算

+, - (二項演算子), ||

加算、減算、連結

Oracle CQL 条件は Oracle CQL 演算子の後に評価されます

第 12 章「条件」を参照


優先順位の例 以下の例では、乗算の優先順位が加算よりも高いため、先に 2 と 3 の乗算が行われ、その結果が 1 に加算されます。

1+2*3 

式の中で括弧を使用すると、演算子の優先順位を上書きできます。括弧内の式が括弧外の式よりも先に評価されます。


算術演算子

表 4-2 は、Oracle CEP でサポートされる算術演算子を示しています。算術演算子を 1 つまたは 2 つの引数と共に使用して、数値を否定、加算、減算、乗算、および除算できます。これらの演算子の一部は日時と期間の算術演算でも使用されます。演算子の引数は、数値データ型または数値データ型に暗黙的に変換される任意のデータ型に解決される必要があります。

特定のケースでは、Oracle CEP によって、引数が操作に必要なデータ型に変換されます。たとえば、整数と浮動小数点数を加算する場合は、整数の引数が浮動小数点数に変換されます。結果の式のデータ型は浮動小数点数です。詳細については、「暗黙的なデータ変換」を参照してください。

表 4-2 算術演算子

演算子 目的

+ -

正または負の式を表す場合は単項演算子です。

<query id="q1"><![CDATA[ 
    select * from orderitemsstream
    where quantity = -1
]]></query>

+ -

加算または減算の場合は二項演算子です。

<query id="q1"><![CDATA[ 
    select hire_date 
    from employees
    where sysdate - hire_date
  > 365
]]></query>

* /

乗算、除算。これらは二項演算子です。

<query id="q1"><![CDATA[ 
    select hire_date 
    from employees
    where bonus > salary * 1.1
]]></query>

二重否定または負の値の減算を表す場合に、連続する 2 つのマイナス記号 (--) を算術式で使用しないでください。スペースまたは括弧を使用して、連続するマイナス記号を区切る必要があります。

Oracle CEP では、数値リテラル、日時リテラル、期間リテラルを使用した算術演算がサポートされています。

詳細については、以下を参照してください。


連結演算子

連結演算子は文字列を操作します。表 4-3 は連結演算子を示しています。

表 4-3 連結演算子

演算子 目的

||


文字列を連結します。

<query id="q263"><![CDATA[ 
    select length(c2 || c2) + 1 from S10 where length(c2) = 2
]]></query>

2 つの文字列を連結した結果は、別の文字列になります。文字列のデータ型が両方とも CHAR の場合、結果のデータ型は CHAR であり、2000 文字に制限されます。文字列のデータ型にかかわらず、連結では文字列末尾の空白が維持されます。

Oracle CEP では長さ 0 の文字列が null として処理されますが、長さ 0 の文字列と別のオペランドを連結した結果は常に別のオペランドになります。そのため、null が生成されるのは 2 つの null 文字列を連結した場合のみです。ただし、将来の Oracle CEP バージョンではこの処理が変更される場合があります。null の可能性のある式を連結するには、NVL 関数を使用して明示的に式を長さ 0 の文字列に変換します。

例 4-1 は、連結演算子を使用して文字列 "xyz" を select 文の c2 の値に付加する方法を示します。

例 4-1 連結演算子 (||)

<query id="q264"><![CDATA[ 
    select c2 || "xyz" from S10
]]></query>

範囲ベースのストリームからリレーションへの枠演算子

Oracle CQL では、以下の範囲ベースのストリームからリレーションへの枠演算子がサポートされています。

window_type_range::=

window_type_range.gif を説明する関連テキスト

(time_spec::=)

詳細については、以下を参照してください。


S[now]

この時間ベースの範囲枠では瞬間的なリレーションが出力されます。このため、時間 tnow 枠の出力は、その瞬間 t に到着したすべてのタプルになります。Oracle CEP の時間の最小単位はナノ秒であるため、これらのすべてのタプルは 1 ナノ秒後に期限切れになります。

例については、「S [now] の例」を参照してください。

S [now] の例

例 4-2 のクエリ q1例 4-3 のデータ ストリーム S があるとします。タイムスタンプはナノ秒 (1 秒 = 10^9 ナノ秒) で示されています。例 4-4 は、時間 5000 ms にクエリで返されるリレーションを示します。時間 5002 ms には空のリレーションが返されます。

例 4-2 S [now] のクエリ

<query id="q1"><![CDATA[ 
    SELECT * FROM S [now]
]]></query>

例 4-3 S [now] のストリーム入力

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

例 4-4 S [now] の時間 5000000000 ns のリレーション出力

Timestamp   Tuple Kind  Tuple
5000000000  +           33,4.4
5000000000  +           23,56.33
5000000001  -           33,4.4
5000000001  -           23,56.33

S[range T]

この時間ベースの範囲枠では、サイズ T の時間単位の間隔をスライドさせ、並べられたストリームの最新部分を取得することで、時間の経過に沿った出力リレーションが定義されます。

例については、「S [range T] の例」を参照してください。

S [range T] の例

例 4-5 のクエリ q1 があるとします。例 4-6 のデータ ストリーム S がある場合に、例 4-7 のリレーションがクエリで返されます。デフォルトでは、範囲の時間単位は second であるため (time_spec::= を参照)、S[range 1]S[Range 1 second] と同等です。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。最初の 1000 ms の間隔に存在している要素が枠に入ります。つまり、タプル (10,0.1) および (15,0.14) です。時間 2000 ms には、この間隔よりも長い間枠に留まっていたタプルがリレーションから削除の対象になります。つまり、タプル (10,0.1) です。時間 2002 ms には、タプル (15,0.14) が削除の対象になります。これは、枠に留まっていた期間がその時点で 1000 ms を超えたためです。


注意 :

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

例 4-5 S [range T] のクエリ

<query id="q1"><![CDATA[ 
    SELECT * FROM S [range 1]
]]></query>

例 4-6 S [range T] のストリーム入力

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

例 4-7 S [range T] のリレーション出力

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

S[range T1 slide T2]

この時間ベースの範囲枠では、過去のタプルを維持する必要のある期間 (範囲) と、タプルの出力を表示する頻度 (スライド) を指定できます。そのため、2 つのタプルが期間 n*T2(n+1)*T2 の間に到着した場合、これらは (n+1)*T2 の時点でのみ見えるようになり (枠に入り)、(n+1)*T2+T1 の時点で枠から期限切れになります。

例については、「S [range T1 slide T2] の例」を参照してください。

S [range T1 slide T2] の例

例 4-8 のクエリ q1 があるとします。例 4-9 のデータ ストリーム S がある場合に、例 4-10 のリレーションがクエリで返されます。デフォルトでは、範囲の時間単位は second であるため (time_spec::= を参照)、S[range 10 slide 5]S[Range 10 seconds slide 5 seconds] と同等です。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。スライド値は 5 秒であり、これはユーザが 5 秒ごとに出力の表示を確認することを意味するため、1000、1002、5000 に到着したすべてのタプルは 5000 の時点で枠に入ります。これらのタプルは 5 秒 = 5000 ms に枠に入りますが、範囲値は 10 秒 = 10000 ms であるため、15000 ms に期限切れになります。

例 4-8 S [range T1 slide T2] のクエリ

<query id="q1"><![CDATA[ 
    SELECT * FROM S [range 10 slide 5]
]]></query>

例 4-9 S [range T1 slide T2] のストリーム入力

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

例 4-10 S [range T1 slide T2] のリレーション出力

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

S[range unbounded]

この時間ベースの範囲枠では、T = infinity である場合に、時間 t のリレーションが時間 t までの S のすべての要素から取得されたタプルで構成されるように、出力リレーションが定義されます。要素は枠内で無限に維持されます。

例については、「S [range unbounded] の例」を参照してください。

S [range unbounded] の例

例 4-11 のクエリ q1例 4-12 のデータ ストリーム S があるとします。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。要素は到着した時点でリレーションに挿入されます。どの要素も削除されません。例 4-13 は時間 5000 ms にクエリで返されるリレーションを示します。例 4-14 は時間 205000 ms にクエリで返されるリレーションを示します。

例 4-11 S [range unbounded] のクエリ

<query id="q1"><![CDATA[ 
    SELECT * FROM S [range unbounded]
]]></query>

例 4-12 S [range unbounded] のストリーム入力

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

例 4-13 S [range unbounded] の時間 5000 ms のリレーション出力

Timestamp   Tuple Kind  Tuple
  1000:     +           10,0.1
  1002:     +           15,0.14
  5000:     +           33,4.4

例 4-14 S [range unbounded] の時間 205000 ms のリレーション出力

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

S[range C on E]

この定数値ベースの範囲枠では、ストリーム要素 E の値の差が C 未満のタプルから成る、識別子 E に基づいて並べられたストリームの最新部分を取得することで、出力リレーションが定義されます。ストリーム要素 E の値とリレーションの任意のタプルの値の差が C 以上の場合、タプルは削除の対象になります。

例については、以下を参照してください。

S [range C on E] の例 : 定数値

例 4-15 のクエリ tkdata56_q0例 4-16 のデータ ストリーム tkdata56_S0 があるとします。ストリーム tkdata56_S0 のスキーマは (c1 integer, c2 float) です。例 4-17 は、クエリで返されるリレーションを示します。この例では、時間 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 未満でないためです。

例 4-15 S [range C on E] 定数値 : クエリ

<query id="tkdata56_q0"><![CDATA[ 
    select * from tkdata56_S0 [range 10 on c1]
]]></query>

例 4-16 S [range C on E] 定数値 : ストリーム入力

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

例 4-17 S [range C on E] 定数値 : リレーション出力

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] 枠では INTERVALTIMESTAMP を使用できます。例 4-18 のクエリ tkdata56_q2例 4-19 のデータ ストリーム tkdata56_S1 があるとします。ストリーム tkdata56_S1 のスキーマは (c1 timestamp, c2 double) です。例 4-20 は、クエリで返されるリレーションを示します。

例 4-18 S [range C on E] INTERVAL 値 : クエリ

<query id="tkdata56_q2"><![CDATA[ 
    select * from tkdata56_S1 [range INTERVAL "530 0:0:0.0" DAY TO SECOND on c1] 
]]></query>

例 4-19 S [range C on E] INTERVAL 値 : ストリーム入力

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

例 4-20 S [range C on E] INTERVAL 値 : リレーション出力

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::=

window_type_tuple.gif を説明する関連テキスト

詳細については、以下を参照してください。


S [rows N]

タプルベースの枠では、並べられたストリームの最後の N タプルの枠をスライドさせることで、時間の経過に沿った出力リレーションが定義されます。

S [rows N] の出力リレーション R の場合、時間 t のリレーションは、大きいタイムスタンプ (<= t) を持つ SN 個のタプル (または、t までの S の長さが <= N の場合はすべてのタプル) で構成されます。

同じタイムスタンプを持つ複数のタプルがある場合は、N 個のタプルが返されることを保証するため、Oracle CEP によって確定的でない方法で 1 つのタプルが選択されます。このため、タプルベースの枠はタイムスタンプが一意でないストリームには適していない場合があります。

デフォルトでは、スライドは 1 です。

詳細については、「S [rows N] の例」を参照してください。

S [rows N] の例

例 4-21 のクエリ q1例 4-22 のデータ ストリーム S があるとします。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。要素は S [Range 1] の場合と同様に挿入および削除されます (「S [range T] の例」を参照)。

例 4-23 は、時間 1003 ms にクエリで返されるリレーションを示します。この時点の S の長さは rows 値 (3) 以下であるため、その時点までに挿入された S のすべてのタプルがクエリで返されます。つまり、タプル (10,0.1) および (15,0.14) です。

例 4-24 は、時間 1007 ms にクエリで返されるリレーションを示します。この時点の S の長さは rows 値 (3) を超えているため、1007 ms 以下の大きいタイムスタンプを持つ S の 3 つのタプルがクエリで返されます。つまり、タプル (15,0.14)(33,4.4)、および (23,56.33) です。

例 4-25 は、時間 2001 ms にクエリで返されるリレーションを示します。この時点では、Oracle CEP によってデフォルトの範囲 (およびスライド) の 1000 ms (1 秒) を超えて枠に留まっている要素が削除されます。この時点の S の長さは rows 値 (3) 以下であるため、その時点までに挿入された S のすべてのタプルがクエリで返されます。つまり、タプル (17,1.3) です。

例 4-21 S [rows N] のクエリ

<query id="q1"><![CDATA[ 
    SELECT * FROM S [rows 3] 
]]></query>

例 4-22 S [rows N] のストリーム入力

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

例 4-23 S [rows N] の時間 1003 ms のリレーション出力

Timestamp   Tuple Kind  Tuple
  1000:     +           10,0.1
  1002:     +           15,0.14

例 4-24 S [rows N] の時間 1007 ms のリレーション出力

Timestamp   Tuple Kind  Tuple
  1002:     +           15,0.14
  1004:     +           33,4.4
  1006:     +           23,56.33

例 4-25 S [rows N] の時間 2001 ms のリレーション出力

Timestamp   Tuple Kind  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

S [rows N1 slide N2]

並べられたストリームの最後の N1 タプルの枠をスライドさせることで、時間の経過に沿った出力リレーションを定義するタプルベースの枠です。

S [rows N1 slide N2] の出力リレーション R の場合、時間 t のリレーションは、大きいタイムスタンプ (<= t) を持つ SN1 個のタプル (または、t までの S の長さが <= N の場合はすべてのタプル) で構成されます。

同じタイムスタンプを持つ複数のタプルがある場合は、N 個のタプルが返されることを保証するため、Oracle CEP によって確定的でない方法で 1 つのタプルが選択されます。このため、タプルベースの枠はタイムスタンプが一意でないストリームには適していない場合があります。

整数のストリーム要素数としてスライド N2 をコンフィグレーションできます。Oracle CEP では N2 個の要素を受け取るまで、リレーションへの要素の追加が遅延されます。

詳細については、「S [rows N] の例」を参照してください。

S [rows N1 slide N2] の例

例 4-26 のクエリ tkdata55_q0例 4-27 のデータ ストリーム tkdata55_S55 があるとします。ストリーム tkdata55_S55 のスキーマは (c1 integer, c2 float) です。例 4-28 は、出力リレーションを示します。

例 4-28 に示すように、時間 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 個数のタプルが到着します。この時点で、rows 値で指定された制約を満たすため、最も古いタプル (20,0.1) が削除対象になります。つまり、出力リレーションに含まれる要素は 5 つまでという制約です。この時点で、出力リレーションに含まれるタプルは (15,0.14)(5,0.2)(8,0.2)(10,0.22)、および (20,0.25) です。時間 600000 までに、別の slide 個数のタプルが到着します。この時点で、rows 値の制約を満たすため、最も古いタプル (15,0.14) および (5,0.2) が削除対象になります。この時点で、出力リレーションに含まれるタプルは (8,0.2)(10,0.22)(20,0.25)(30,0.3)、および (40,0.4) です。

例 4-26 S [rows N1 slide N2] のクエリ

<query id="tkdata55_q0"><![CDATA[ 
    select * from tkdata55_S55 [rows 5 slide 2 ]
]]></query>

例 4-27 S [rows N1 slide N2] のストリーム入力

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

例 4-28 S [rows N1 slide N2] のリレーション出力

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::=

window_type_partition.gif を説明する関連テキスト

(time_spec::=non_mt_attr_list::=)

詳細については、以下を参照してください。


S [partition by A1,..., Ak rows N]

ストリーム S に対するこの分割されたスライド枠では、正の整数のタプル数 N とストリーム属性のサブセット {A1,... Ak} をパラメータとして受け取り、以下のことを行います。

例については、「S[partition by A1, ..., Ak rows N] の例」を参照してください。

S[partition by A1, ..., Ak rows N] の例

例 4-29 のクエリ qPart_row2例 4-30 のデータ ストリーム SP1 があるとします。ストリーム SP1 のスキーマは (c1 integer, name char(10)) です。例 4-31 は、クエリで返されるリレーションを示します。デフォルトでは、範囲 (およびスライド) は 1 秒です。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。


注意 :

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

例 4-29 S[partition by A1, ..., Ak rows N] のクエリ

<query id="qPart_row2"><![CDATA[ 
    select * from SP1 [partition by c1 rows 2] 
]]></query>

例 4-30 S[partition by A1, ..., Ak rows N] のストリーム入力

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

例 4-31 S[partition by A1, ..., Ak rows N] のリレーション出力

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 [partition by A1,..., Ak rows N range T]

ストリーム S に対するこの分割されたスライド枠では、正の整数のタプル数 N とストリーム属性のサブセット {A1,... Ak} をパラメータとして受け取り、以下のことを行います。

例については、「S[partition by A1, ..., Ak rows N range T] の例」を参照してください。

S[partition by A1, ..., Ak rows N range T] の例

例 4-32 のクエリ qPart_range2例 4-33 のデータ ストリーム SP5 があるとします。ストリーム SP5 のスキーマは (c1 integer, name char(10)) です。例 4-34 は、クエリで返されるリレーションを示します。デフォルトでは、範囲の時間単位は second であるため (time_spec::= を参照)、range 2range 2 seconds と同等です。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。

例 4-32 S[partition by A1, ..., Ak rows N range T] のクエリ

<query id="qPart_range2"><![CDATA[ 
    select * from SP5 [partition by c1 rows 2 range 2]
]]></query>

例 4-33 S[partition by A1, ..., Ak rows N range T] のストリーム入力

Timestamp   Tuple
1000        1,abc
2000        1,abc
3000        1,abc
4000        1,abc
5000        1,def
6000        1,xxx
h 200000000

例 4-34 S[partition by A1, ..., Ak rows N range T] のリレーション出力

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 [partition by A1,..., Ak rows N range T1 slide T2]

ストリーム S に対するこの分割されたスライド枠では、正の整数のタプル数 N とストリーム属性のサブセット {A1,... Ak} をパラメータとして受け取り、以下のことを行います。

例については、「S[partition by A1, ..., Ak rows N] の例」を参照してください。

S[partition by A1, ..., Ak rows N range T1 slide T2] の例

例 4-35 のクエリ qPart_rangeslide例 4-36 のデータ ストリーム SP1 があるとします。ストリーム SP1 のスキーマは (c1 integer, name char(10)) です。例 4-37 は、クエリで返されるリレーションを示します。デフォルトでは、範囲とスライドの時間単位は second であるため (time_spec::= を参照)、range 1 slide 1range 1 second slide 1 second と同等です。タイムスタンプはミリ秒 (1 秒 = 1000 ms) で示されています。

例 4-35 S[partition by A1, ..., Ak rows N range T1 slide T2] のクエリ

<query id="qPart_rangeslide"><![CDATA[ 
    select * from SP1 [partition by c1 rows 1 range 1 slide 1] 
]]></query>

例 4-36 S[partition by A1, ..., Ak rows N range T1 slide T2] のストリーム入力

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

例 4-37 S[partition by A1, ..., Ak rows N range T1 slide T2] のリレーション出力

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

リレーションからストリームへの IStream 演算子

タプル sR(t) - R(t-1) に含まれている場合は常に、つまり、t の時点で sR に挿入された場合は常に、リレーション R に適用された Istream (「挿入ストリーム」を意味する) には (s,t) が含まれます。同じタイムスタンプでタプルの挿入と削除の両方が発生した場合、Istream では挿入が出力されません。

例 4-38 では、select によって、フィルタ条件 (viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID) を満たすタプルのストリームが出力されます。now 枠によって viewq3 がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへの IStream 演算子によって、フィルタ出力がストリームに変換されます。

例 4-38 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>

詳細については、xstream_clause::= を参照してください。


リレーションからストリームへの DStream 演算子

タプル sR(t-1) - R(t) に含まれている場合は常に、つまり、t の時点で sR から削除された場合は常に、リレーション R に適用された Dstream (「削除ストリーム」を意味する) には (s,t) が含まれます。

例 4-39 では、クエリによってストリーム S の入力が 10 分遅延されます。ストリーム S は range 枠演算子によってリレーションに変換されますが、Dstream によってストリームに戻されます。

例 4-39 DStream

<query id="BBAQuery"><![CDATA[ 
    Dstream(select * from S[range 10 minutes])
]]></query>

時間の最小単位を分と想定します。表 4-4 は、以下の入力ストリーム TradeInputs からの入力について、range 枠演算子のリレーションと Dstream のストリームのコンテンツを示しています。

Time    Value
05      1,1
25      2,2
50      3,3

表 4-4 Dstream の出力例

入力ストリーム S リレーション S[Range 10 minutes] の出力 Dstream 出力

05    1,1

+ 05    1,1



- 15    1,1

15    1,1

25    2,2

+ 25    2,2



- 35    2,2

35    2,2

50    3,3

+ 50    3,3



- 60    3,3

60    3,3


時間 15 の時点で、リレーションは空です : R(15) = {} (空のセット)

詳細については、xstream_clause::= を参照してください。


リレーションからストリームへの RStream 演算子

RStream 演算子は、入力リレーションの現在の状態全体を維持し、各時間ステップごとにすべてのタプルを挿入として出力します。

Rstream では各瞬間のリレーション全体の状態が出力されるため、リレーション セットが非常に小さい場合を除き、コストがかかる可能性があります。

例 4-40 では、Rstream によって時間 Nowwhere 句でフィルタ処理されたリレーション全体の状態が出力されます。

例 4-40 RStream

<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>

詳細については、xstream_clause::= を参照してください。