ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Event Processing CQL言語リファレンス
11gリリース1 (11.1.1.7)
B61613-06
  目次へ移動
目次

前
 
次
 

3 疑似列

この章では、Oracle Continuous Query Language (Oracle CQL)の疑似列のリファレンスを提供します。疑似列は、問い合せることはできますが、イベントの作成元であるデータの一部ではありません。

この章の内容は次のとおりです。

3.1 疑似列の概要

疑似列からの選択はできますが、値の変更はできません。疑似列は引数のない関数にも似ています(1.1.11項「関数」を参照)。

Oracle CQLでは、次の疑似列がサポートされています。

3.2 ELEMENT_TIME疑似列

基本ストリームまたは派生したストリーム(ストリームに対して評価するビュー)の各ストリーム要素には、関連する要素時間があります。ELEMENT_TIME疑似列により、この時間がOracle CQLネイティブ・タイプbigintとして返されます。


注意:

ELEMENT_TIMEは、Oracle CQLリレーションのメンバーではサポートされません。詳細は、1.1.1項「ストリームとリレーション」を参照してください。


この項の内容は、次のとおりです。

詳細は、次を参照してください。

3.2.1 ELEMENT_TIME疑似列の値について

ELEMENT_TIME疑似列の値は、ストリーム要素のチャネルをシステム・スタンプ付きか、アプリケーション・スタンプ付きのいずれかとして構成するかにより異なります。

3.2.1.1 システム・タイムスタンプ付きストリームの場合のELEMENT_TIME

この場合、ストリーム要素の要素時間は、Oracle Event Processingシステムで、システム指定時刻の2つの値を減算し、経過した実時間とおおよそ一致する時間を計算することによって指定されます。

詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のシステム・タイムスタンプ付きのチャネルに関する項を参照してください。

3.2.1.2 アプリケーション・タイムスタンプ付きストリームの場合のELEMENT_TIME

この場合は、関連する要素時間は、アプリケーションで、アプリケーション・アセンブリ・ファイルwlevs:expression要素を使用して、派生タイムスタンプ式を指定することにより指定されます。

Oracle Event Processingでは、この式の結果は次のように処理されます。

詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のアプリケーション・タイムスタンプ付きのチャネルに関する項を参照してください。

3.2.1.2.1 intまたはbigintに対して評価を行う派生タイムスタンプ式

派生タイムスタンプ式が、Oracle CQLネイティブ・タイプintに対して評価を行う場合、対応するbigint値として結果が返されます。この式がOracle CQLネイティブ・タイプbigintに対して評価を行う場合は、その値がそのまま返されます。

3.2.1.2.2 timestampに対して評価を行う派生タイムスタンプ式

派生タイムスタンプ式がOracle CQLネイティブ・タイプtimestampに対して評価を行う場合は、この時間値をJanuary 1, 1970, 00:00:00 GMTなど、"Epoch"(エポック)と呼ばれる標準の基本時間以降のミリ秒として表すことにより、long値に変換されます。

3.2.2 Oracle CQL問合せ内での_TIME疑似列の使用

この項では、様々な問合せでELEMENT_TIMEを使用する方法を説明します。

3.2.2.1 SELECTでのELEMENT_TIMEの使用

例3-1は、select文でELEMENT_TIME疑似列を使用する方法を示しています。ストリームS1のスキーマは(c1 integer)です。例3-2に示す入力ストリームがある場合、この問合せは例3-3に示す結果を返します。関数to_timestampを使用して、Long値をタイムスタンプ値に変換しています。

例3-1 Select文でのELEMENT_TIME疑似列

<query id="q4"><![CDATA[ 
    select 
        c1, 
        to_timestamp(element_time) 
    from 
        S1[range 10000000 nanoseconds slide 10000000 nanoseconds]
]]></query>

例3-2 入力ストリーム

Timestamp   Tuple
 8000       80
 9000       90
13000       130
15000       150
23000       230
25000       250

例3-3 出力リレーション

Timestamp   Tuple Kind  Tuple
 8000       +           80,12/31/1969 17:00:08
 8010       -           80,12/31/1969 17:00:08
 9000       +           90,12/31/1969 17:00:09
 9010       -           90,12/31/1969 17:00:09
13000       +           130,12/31/1969 17:00:13
13010       -           130,12/31/1969 17:00:13
15000       +           150,12/31/1969 17:00:15
15010       -           150,12/31/1969 17:00:15
23000       +           230,12/31/1969 17:00:23
23010       -           230,12/31/1969 17:00:23
25000       +           250,12/31/1969 17:00:25
25010       -           250,12/31/1969 17:00:25

問合せにGROUP BY句が含まれる場合、SELECT文で直接ELEMENT_TIME疑似列を使用することはできません。かわりに、3.2.2.2項「GROUP BYでのELEMENT_TIMEの使用」に説明されているように、ビューを使用します。

3.2.2.2 GROUP BYでのELEMENT_TIMEの使用

例3-4の問合せQ1があるとします。GROUP BY句があるため、問合せのSELECT文でELEMENT_TIMEを使用することはできません。

例3-4 GROUP BYを含む問合せ

<query id="Q1"><![CDATA[ 
    SELECT
        R.queryText AS queryText,
        COUNT(*) AS queryCount
    FROM
        queryEventChannel [range 30 seconds] AS R
    GROUP BY
        queryText
]]></query>

かわりに、例3-5に示すようなビューを作成します。V1に相当する派生したストリームには、特定のqueryTextグループに対して(queryTextqueryCountmaxTime)が変わるたびに、ストリーム要素が含められます。

例3-5 ビュー

<view id="V1"><![CDATA[ 
    ISTREAM (
        SELECT
            R.queryText AS queryText,
            COUNT(*) AS queryCount,
            MAX(R.ELEMENT_TIME) as maxTime
        FROM
            queryEventChannel [range 30 seconds] AS R
        GROUP BY
            queryText
    )
]]></view>

ビューV1の出力要素に関連付けられている要素時間は、出力イベントの属性maxTimeの値と同じである必要はありません。たとえば、ウィンドウがスライドし、queryEventChannel入力ストリームからの要素がそのウィンドウで期限切れとなった場合に、queryTextグループのqueryCountが変わり、出力となります。ただし、そのウィンドウに入る入力ストリームqueryEventChannelからの新しいイベントがないので、そのウィンドウ内のすべてのイベント間のmaxTimeは変わらず、この出力イベントのmaxTime属性の値は、以前の出力イベントのこの属性値と同じになります。

ただし、出力イベントのELEMENT_TIMEは、出力イベントのELEMENT_TIMEは出力イベントの"maxTime"属性の値とは異なるなど、入力ストリームからの最新イベントとは異なり、イベントがウィンドウで期限切れとなった瞬間と同じになります。

ビューV1の出力イベントのELEMENT_TIMEを選択するには、例3-6に示すように問合せを作成します。

例3-6 問合せ

<query id="Q1"><![CDATA[ 
    SELECT
        queryText,
        queryCount,
        ELEMENT_TIME as eventTime
    FROM
        V1
]]></query>

3.2.2.3 PATTERNでのELEMENT_TIMEの使用

例3-7は、pattern問合せでELEMENT_TIME疑似列を使用する方法を示します。Nth.statusの値が>= F.statusで、そのタプルのNth.ELEMENT_TIME値と最後にFに一致したタプルとの差がjava.lang.Math.Bigint(Long)として指定された間隔に満たない場合、タプルまたはイベントは相関変数Nthに一致します。

例3-7 PatternでのELEMENT_TIME疑似列

...
PATTERN (F Nth+? L)
        DEFINE
            Nth AS 
                Nth.status >= F.status
                AND 
                Nth.ELEMENT_TIME - F.ELEMENT_TIME < 10000000000L,
            L AS 
                L.status >= F.status 
                AND 
                count(Nth.*) = 3
                AND L.ELEMENT_TIME - F.ELEMENT_TIME < 10000000000L 
...