Oracle® Fusion Middleware Oracle Complex Event Processing EPL言語リファレンス 11gリリース1 (11.1.1.6.2) B55579-04 |
|
戻る |
次へ |
この章では、イベント処理言語(EPL)の関数のリファレンスについて説明します。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CEP)を使用する必要があります。
この節では、以下の項目について説明します。
単一行関数は、文で生成された1つの結果行につき1つの値を返します。これらの関数は、式が許可されている任意の場所で使用することができます。
EPLでは静的Javaライブラリ・メソッドを単一行関数として使用できます。また、組込みの単一行関数も提供されます。
EPLでは、以下のJavaライブラリ・パッケージが自動的にインポートされます。
java.lang.*
java.math.*
java.text.*
java.util.*
このため、以下の例のように、すべての式でJava静的ライブラリ・メソッドを使用できます。
SELECT symbol, Math.round(volume/1000) FROM StockTickEvent RETAIN 30 SECONDS
他の任意のJavaクラスを使用することもできますが、完全修飾名を使用するか、インポートのために構成する必要があります。詳細は、4.3項「ユーザー定義関数」を参照してください。
以下の表に、使用可能な組込みの単一行関数の概要を示します。
表4-1組込みの単一行関数
単一行関数 | 結果 | 参照先 |
---|---|---|
|
カンマ区切りの複数の式の中で最大の数値を返します。 |
|
|
カンマ区切りの複数の式の中で最小の値を返します。 |
|
|
リスト内の最初のnull以外の値を返します。null以外の値がない場合は、nullを返します。 |
|
|
最初の値と一致する |
|
|
最初の条件を満たす結果を返します。 |
|
|
データ枠内のイベント順序に関して、前のイベントのプロパティ値を返します。 |
|
|
本来のイベント到着の順序に関して、前のイベントのプロパティ値を返します。 |
|
SELECT
CASE
WHEN |
式で返される値の型が指定されたいずれかの値であるかどうかを示す |
|
SELECT |
指定した型に式の戻り値の型をキャストします。 |
|
SELECT |
関数へのパラメータで指定された動的プロパティがイベント内に存在するかどうかを示すブール値を返します。 |
|
ユーザー定義の単一行関数を作成することもできます。4.3項「ユーザー定義関数」を参照してください。
MIN
およびMAX
関数は複数の式パラメータを受け取ります。MIN
関数はカンマで区切られたこれらの式の中で最小の数値を返し、MAX
関数は最大の数値を返します。戻り値の型は、互換性のある、すべての戻り値の集約型です。
次の例では、MAX
関数の戻り値の型はDouble
であり、値1.1
が返されます。
SELECT MAX(1, 1.1, 2 * 0.5) FROM ...
MIN
関数は最小値を返します。次の文は、2つのタイム・スタンプの小さい方の値を決定する関数を使用しています。
SELECT symbol, MIN(ticks.timestamp, news.timestamp) AS minT FROM StockTickEvent AS ticks, NewsEvent AS news RETAIN 30 SECONDS WHERE ticks.symbol = news.symbol
MIN
およびMAX
関数は集約関数としても使用できます。この使用方法の説明は、4.2項「集約関数」を参照してください。
COALESCE
関数の結果は、式のリストの中でnull以外の値を返す最初の式になります。戻り値の型は、互換性のある、すべての戻り値の集約型です。
次の例では、String
型の値foo
が返されます。
SELECT COALESCE(NULL, 'foo') FROM …
CASE
制御フロー関数には2つのバージョンがあります。最初のバージョンは、値およびこの値と比較される比較値のリストを受け取り、最初の値が比較値と一致した結果を返します。2つ目のバージョンは、条件リストを受け取り、最初の条件を満たす結果を返します。
CASE
式の戻り値の型は、互換性のある、すべての戻り値の集約型です。
次の例はCASE
文の最初のバージョンです。戻り値の型はString
であり、値one
が返されます。
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END FROM …
CASE
関数の2つ目のバージョンは条件リストを受け取ります。次の例では、戻り値の型はBoolean
であり、Boolean
値true
が返されます。
SELECT CASE WHEN 1>0 THEN true ELSE false END FROM …
PREV
関数は前のイベントのプロパティ値を返します。最初のパラメータは、データ枠で指定された順序で何番目の前のイベントであるかを指定します。第2パラメータは、関数により値が返される、前のイベントのプロパティ名です。
次の例では、現在のTrade
イベントの2つ前のイベントのpriceプロパティの値が選択されます。
SELECT PREV(2, price) FROM Trade RETAIN 10 EVENTS
PREV
関数ではデータ枠で指定された順序が考慮されるため、並べ替えられた枠でこの関数を使用すると便利です。次の例では、最大量、2番目に大きい量、および3番目に大きい量を持つ3つのTradeイベントの銘柄が選択されます。
SELECT PREV(0, symbol), PREV(1, symbol), PREV(2, symbol) FROM Trade RETAIN 10 EVENTS WITH LARGEST volume
何番目の前のイベントであるかを指定するパラメータには、Integer
型の値を返す式を使用することもできます。次の文では、Trade
データ枠が、並べ替えられたTrade
データ枠内の特定の位置を参照するrankプロパティを提供するRankSelectionEvent
イベントと結合されます。
SELECT PREV(rank, symbol) FROM Trade, RankSelectionEvent RETAIN 10 EVENTS WITH LARGEST volume
PREV
関数は、指定されている何番目か前のイベントが現在のデータ枠に含まれていない場合、NULL値を返します。次の例では、時間バッチ枠を使用した例を示しています。このPREV
関数では、前のイベントが同じイベント・バッチ内に存在しない任意のイベントに対してnull値が返されます。結果のnull値が適切でない場合は、下で説明しているPRIOR
関数を使用できます。
SELECT PREV(1, symbol) FROM Trade RETAIN BATCH OF 1 MINUTE
PREV
関数とPARTITION BY
句を組み合せることにより、指定のグループに含まれている前のイベントのプロパティ値が返されます。
たとえば、現在のイベントと同じ銘柄の前のイベントの価格を取得すると想定します。
この問題を解決する文は以下のとおりです。1分の時間枠でsymbolプロパティに対して枠が分割されます。これにより、これまでにない新しい銘柄値がエンジンで検出されると、その銘柄のイベントを個別に保持する新しい枠が作成されます。この結果、PREV
関数では、イベントの銘柄値が持つそれぞれの時間枠内にある前のイベントが返されます。
SELECT PREV(1, price) AS prevPrice FROM Trade RETAIN 1 MIN PARTITION BY symbol
PRIOR
関数は前のイベントのプロパティ値を返します。最初のパラメータは、本来の到着順で何番目の前のイベントであるかを示す整数値です。第2パラメータは、関数により値が返される、前のイベントのプロパティ名です。
次の例では、現在のTrade
イベントの2つ前のイベントのpriceプロパティの値が選択されます。
SELECT PRIOR(2, price) FROM Trade RETAIN ALL
PRIOR
関数は任意のイベント・ストリームまたはビューに対して使用でき、PREV
関数のようにRETAIN
句の制約をストリームに付与する必要がありません。関数は、イベントを提供するイベント・ストリーム内のイベントの到着順に基づいて動作します。
次の文では、長さのバッチ枠を使用してTrade
イベント3件ごとの平均量を計算し、イベント3件ごとに結果をポストします。SELECT
句では現在の平均およびその前の平均を選択するためにPRIOR
関数を使用します。
SELECT AVG(volume) AS avgVolume, AVG(PRIOR(3, volume)) FROM Trade RETAIN BATCH OF 3 EVENTS
INSTANCEOF
関数は、式で返される値の型が指定されたいずれかの値であるかどうかを示すブール値を返します。INSTANCEOF
関数の最初のパラメータは評価される式です。第2パラメータ以降はJava型名です。
INSTANCEOF
関数は実行時に式を評価して戻り値の型を決定し、式で返されたオブジェクトの型を定義されている型と比較します。式で返されたオブジェクトの型が指定された型のいずれかと一致する場合は、trueを返します。式で返された値がnullまたは指定されたどの型とも一致しない型の場合は、falseを返します。
INSTANCEOF
関数は多くの場合、動的な(チェックされていない)プロパティとともに使用されます。動的プロパティとはコンパイル時に型が不明なプロパティです。
次の例では、INSTANCEOF
関数を使用して、型に基づいて異なるプロパティを選択します。
SELECT CASE WHEN INSTANCEOF(item, com.mycompany.Service) THEN serviceName? WHEN INSTANCEOF(item, com.mycompany.Product) THEN productName? END FROM OrderEvent
INSTANCEOF
関数は、INSTANCEOF
で調査した式がnullを返す場合はfalseを返します。
型パラメータに使用できる値は以下のとおりです。
int
、long
、byte
、short
、char
、double
、float
、string
の任意のJava組込み型(string
は、java.lang.String
の短縮表記です)。型名では大文字と小文字が区別されません。たとえば、次の関数は動的なprice
プロパティがfloat
型またはdouble
型であるかどうかを調べます。
INSTANCEOF(price?, double, float)
調査するクラスの完全修飾クラス名。例を示します。
INSTANCEOF(product, org.myproducer.Product)
型パラメータ・リストに使用できる値は以下のとおりです。
INSTANCEOF
関数ではイベント・クラスのスーパークラス、およびスーパークラスによって直接または間接的に実装されたすべてのインタフェースが考慮されます。
CAST
関数は式の戻り値の型を目的の型にキャストします。関数は2つのパラメータを受け取ります。最初のパラメータはプロパティ名、またはキャストする値が返される式です。第2パラメータはキャストする型です。
第2の型パラメータに使用できる値は以下のとおりです。
int
、long
、byte
、short
、char
、double
、float
、string
の任意のJava組込み型(string
は、java.lang.String
の短縮表記です)。型名では大文字と小文字が区別されません。例を示します。
cast(price, double)
キャストするクラスの完全修飾クラス名。例を示します。
cast(product, org.myproducer.Product)
CAST
関数は多くの場合、動的な(チェックされていない)プロパティの型を提供するために使用されます。動的プロパティとはコンパイル時に型が不明なプロパティです。これらのプロパティの型は常にjava.lang.Object
です。
次の例は、CAST
関数を使用してOrderEvent
でitem
の動的なprice
プロパティをdouble
値にキャストする方法を示します。
SELECT CAST(item.price?, double) FROM OrderEvent
CAST
関数は、式の結果を目的の型にキャストできない場合または式の結果自体がnullである場合、null値を返します。
CAST
関数には、次の型変換ルールが適用されます。
すべての数値型の場合、CAST
関数は必要であれば数値型の変換にjava.lang.Number
を使用します。
string
またはjava.lang.String
へのキャストの場合、CAST
関数は式の結果に対してtoString
を呼び出します。
アプリケーション・オブジェクトを含む他のオブジェクトへのキャストの場合、CAST
関数ではJavaクラスのスーパークラス、およびスーパークラスによって直接または間接的に実装されたすべてのインタフェースが考慮されます。
EXISTS
関数は、関数へのパラメータで指定された動的プロパティがイベント内に存在するかどうかを示すブール値を返します。EXISTS
関数は唯一のパラメータとして1つの動的プロパティ名を受け取ります。
動的な(チェックされていない)プロパティでEXISTS
関数を使用します。動的プロパティとはコンパイル時に型が不明なプロパティです。動的プロパティは、動的プロパティがイベントに存在しない場合、または動的プロパティが存在しても値がnullである場合、null値を返します。
EXISTS
関数を使用した次の例では、serviceName
プロパティを持つオブジェクトがitem
プロパティに含まれている場合、trueが返されます。item
プロパティがnullである場合、またはserviceName
というプロパティを持つオブジェクトがitem
プロパティに含まれていない場合は、falseが返されます。
SELECT EXISTS(item.serviceName?) FROM OrderEvent
集約関数には、SUM
、AVG
、COUNT
、MAX
、MIN
、MEDIAN
、STDDEV
、AVEDEV
があります。集約関数を使用してイベント・プロパティのデータを計算および要約できます。たとえば、直前の30秒間のすべての株価表示イベントの合計額を算出する場合は、以下のようになります。
SELECT SUM(price) FROM StockTickEvent RETAIN 30 SECONDS
集約関数の構文は、以下のとおりです。
aggregate_function( [ALL | DISTINCT] expression)
イベント・ストリーム枠や他のビュー内のすべてのイベント、または1つ以上のイベントのグループに集約関数を適用できます。EPLでは、集約関数が適用されるイベント・セットごとに1つの値が生成されます。
式は通常、イベント・プロパティ名です。ただし、定数、関数、または算術演算子でつながれたイベント・プロパティ名、定数、関数の任意の組み合わせを使用できます。
たとえば、価格が倍増したときに直前の30秒間のすべての株価表示イベントの平均額を算出する場合は、以下のようになります。
SELECT AVG(price * 2) FROM StockTickEvent RETAIN 30 SECONDS
省略可能なキーワードDISTINCT
をすべての集約関数とともに使用して、集約関数が適用される前に重複値を消去できます。デフォルトは、すべてのイベントで操作を実行する省略可能なキーワードALL
です。
MIN
およびMAX
集約関数は単一行関数と同様に使用できます。使用方法は、4.1.1項「MIN関数とMAX関数」を参照してください。
以下の表に、集約関数の構文および生成される結果を示します。
表4-2 集約関数
SELECT
句およびHAVING
句の中で集約関数を使用できます。WHERE
句では集約関数を使用できませんが、WHERE
句を使用して集約関数が適用されるイベントを制限できます。次の問合せでは、銘柄にかかわらず直前の10件の株価表示イベントについて、銘柄ACME
のみに対し株価表示イベントの平均額と合計額を計算します。
SELECT 'ACME stats' AS title, AVG(price) AS avgPrice, SUM(price) AS sumPrice FROM StockTickEvent RETAIN 10 EVENTS WHERE symbol='ACME'
前述の例では、要素10の長さの枠はWHERE
句の影響を受けず、銘柄に関係なくすべてのイベントが長さの枠に入れられ、枠から出されます。直前の10件のACME
イベントのみが必要な場合は、以下のようにMATCHING
句を追加する必要があります。
SELECT 'ACME stats' AS title, AVG(price) AS avgPrice, SUM(price) AS sumPrice FROM (SELECT * FROM StockTickEvent WHERE symbol='ACME') RETAIN 10 EVENT
集約関数は任意の型のイベント・プロパティまたは式で使用できますが、以下の制限があります。
SUM
、AVG
、MEDIAN
、STDDEV
、AVEDEV
は数値のイベント・プロパティのみで使用できます。
EPLでは、集約関数が動作するイベント・プロパティまたは式で返されるnull値はすべて無視されますが、例外的にCOUNT(*)
関数ではnull値も考慮されます。データ・セットにイベントが含まれていない場合、またはデータ・セット内のすべてのイベントの集約式にnull値しか含まれていない場合、すべての集約関数はnullを返します。
集約ユーザー定義関数を作成することもできます。詳細は、4.3項「ユーザー定義関数」を参照してください。
ユーザー定義関数は、任意の場所で式自体として呼び出したり、式の内部で呼び出すことができます。関数は、文の作成時にクラス・ローダーによって解決可能なパブリック静的メソッドである必要があります。エンジンは文の作成時に関数の参照を解決し、パラメータの型を検証します。
注意: EPL問合せでは多重呼出し不変のユーザー定義関数のみを使用できます。つまり、ユーザー定義関数を複数呼び出しても結果は変更されません。 |
次の例では、クラスMyClass
で、2つのパラメータを受け取り、double
などの数値型を返すパブリック静的メソッドmyFunction
が公開されていると想定します。
SELECT 3 * MyClass.myFunction(price, volume) as myValue FROM StockTick RETAIN 30 SECONDS
次の例で示すように、ユーザー定義関数では配列パラメータも使用できます。生成される配列の型の詳細は、3.6項「配列定義演算子」で説明しています。
SELECT * FROM RFIDEvent RETAIN 10 MINUTES WHERE com.mycompany.rfid.MyChecker.isInZone(zone, {10, 20, 30})
Oracle CEPは単一行および集約ユーザー定義関数の両方をサポートします。
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing開発者ガイド for Eclipse』のwlevs:functionに関する項を参照してください。