ヘッダーをスキップ
Oracle® Complex Event Processing CQL言語リファレンス
11g リリース1(11.1.1.4.0)
B61613-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

17 Oracle CEP JDBCデータ・カートリッジ

この章では、データベースに対するSQL問合せの実行を可能にし、CQL問合せで結果が返されるようにする、Oracle CEP JDBCデータ・カートリッジについて説明します。これは、SQL問合せをJDBCカートリッジ関数の定義と関連付けることによって実現します。その後、CQL問合せから、関連付けられているSQL問合せをデータベースに対して実行するJDBCカートリッジ関数の呼出しが可能になります。この関数呼出しは、その関数呼出しを行うCQL問合せ内のCQLリレーションとしてSQL問合せの結果を使用できるようにするため、TABLE句内に含める必要があります。

TABLE句の詳細は、17.2.2.2項「TABLE句の使用」を参照してください。

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

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

17.1 Oracle CEP JDBCデータ・カートリッジについて

Oracle CEPストリームにはストリーミング・データが含まれ、通常、データベースには履歴データが格納されます。Oracle CEP JDBCデータ・カートリッジを使用して、履歴データ(1つ以上の表内に格納される)をOracle CEPストリームからのストリーミング・データと関連付けます。Oracle CEP JDBCデータ・カートリッジは、データベースに対して任意のSQL問合せを実行し、CQL問合せの結果を使用します。この項では、Oracle CEP JDBCデータ・カートリッジを使用して、ストリーミング・データと履歴データを関連付ける方法について説明します。

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

17.1.1 データ・カートリッジ名

Oracle CEP JDBCデータ・カートリッジでは、カートリッジIDcom.oracle.cep.cartrdige.jdbcが使用されます。このIDは予約されるので、他のカートリッジによって使用されません。

詳細は、17.1.4項「Oracle CEP JDBCデータ・カートリッジのアプリケーション・コンテキスト」を参照してください。

17.1.2 有効範囲

Oracle CEP JDBCデータ・カートリッジでは、任意の複雑なSQL文が次の制限下でサポートされます。

  • SQL問合せのSELECTリスト内のネイティブSQLタイプのみを使用できます。

  • SELECTリスト内のユーザー定義タイプおよび複雑なデータベース・タイプは使用できません。

  • SQL問合せ内のすべてのSELECTリスト列に別名を指定する必要があります。

詳細は、17.1.3項「データ型マッピング」を参照してください。


注意:

Oracle CEP JDBCデータ・カートリッジを使用するには、データ・ソースでOracle JDBCのドライバ・バージョン11.2以上が使用される必要があります。

詳細は、『Oracle Complex Event Processing管理者ガイド』の別のデータベース・ドライバまたはドライバのバージョンへのアクセスの構成に関する項を参照してください。


17.1.3 データ型マッピング

この項では、Oracle CEP JDBCデータ・カートリッジのデータ型マッピングについて説明します。

参考として、例17-1に示すようなOracle CEP JDBCデータ・カートリッジ・コンテキスト関数があるとします。

例17-1 Oracle CEP JDBCデータ・カートリッジのSQL文

...
<jc:jdbc-ctx>
    <name>JdbcCartridgeOne</name> 
    <data-source>StockDS</data-source>
    <function name="getDetailsByOrderIdName">
        <param name="inpOrderId" type="int" />
        <param name="inpName" type="char" />
        <return-component-type>
            com.oracle.cep.example.jdbc_cartridge.RetEvent
        </return-component-type>
        <sql><![CDATA[
            SELECT
                Employee.empName as employeeName,
                Employee.empEmail as employeeEmail,
                OrderDetails.description as description
            FROM
                 PlacedOrders, OrderDetails , Employee
            WHERE
                PlacedOrders.empId = Employee.empId AND
                PlacedOrders.orderId = OrderDetails.orderId AND
                Employee.empName = :inpName AND
                PlacedOrders.orderId = :inpOrderId
        ]]></sql>
    </function>
</jc:jdbc-ctx>
...

詳細は、17.1.2項「有効範囲」を参照してください。

17.1.4 Oracle CEP JDBCデータ・カートリッジのアプリケーション・コンテキスト

Oracle CEP JDBCデータ・カートリッジを使用するには、次の手順で説明するように、アプリケーションの開発中に、1つ以上のアプリケーションの有効範囲内にあるJDBCカートリッジ・コンテキストを宣言または構成する必要があります。

17.1.4.1 EPNファイル内でのJDBCカートリッジ・コンテキストの宣言

EPNファイル内でのJDBCカートリッジ・コンテキストの宣言手順:

  1. 例17-2に示すように、必須のネームスペースおよびスキーマの場所のエントリを追加するように、Oracle CEPアプリケーションEPNアセンブリ・ファイルを編集します。

  2. 例17-3に示すように、EPNファイル内でエントリをjdbc-contextタグ付きで追加し、id属性を指定します。idは、このアプリケーションの有効範囲内にあるコンテキストの名前を示し、このコンテキストで定義されている関数を参照するCQL問合せで使用されます。idは、このコンテキストがアプリケーション構成ファイルで構成される際にも使用されます。

例17-2 EPNアセンブリ・ファイル: Oracle CEP JDBCデータ・カートリッジのネームスペースおよびスキーマの場所

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:osgi="http://www.springframework.org/schema/osgi"
       xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
       xmlns:jdbc="http://www.oracle.com/ns/ocep/jdbc"
       xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/osgi
  http://www.springframework.org/schema/osgi/spring-osgi.xsd
  http://www.bea.com/ns/wlevs/spring
  http://www.bea.com/ns/wlevs/spring/spring-wlevs-v11_1_1_3.xsd"
  http://www.oracle.com/ns/ocep/jdbc
  http://www.oracle.com/ns/ocep/jdbc/ocep-jdbc.xsd">

例17-3に、EPNアセンブリ・ファイル内に、JdbcCartridgeOneと言う名前のOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストの作成方法を示します。

例17-3 EPNアセンブリ・ファイルのjdbc:jdbc-context要素

<jdbc:jdbc-context id="JdbcCartridgeOne"/>

17.1.4.2 アプリケーション構成ファイル内でのJDBCカートリッジ・コンテキストの構成

JDBCカートリッジ・コンテキストを構成するには、通常、アプリケーションの/wlevsディレクトリ内にあるコンポーネント構成ファイル内に構成の詳細を追加します。この構成は、チャネルおよびプロセッサなどの他のEPNコンポーネントの構成と同様です。

アプリケーション構成ファイル内でのJDBCカートリッジ・コンテキストの構成手順:

  1. JDBCコンテキスト構成を追加する前に。次の例で示すように、必須のネームスペース・エントリを構成XMLファイルに追加します。

    <?xml version="1.0" encoding="UTF-8"?>
    <jdbcctxconfig:config xmlns:jdbcctxconfig="http://www.bea.com/ns/wlevs/config/application"
        xmlns:jc="http://www.oracle.com/ns/ocep/config/jdbc">
    
  2. JDBCカートリッジ・コンテキスト構成は、親レベルのタグであるjdbc-ctxの下で行われます。コンテキストでは、1つ以上の関数が定義され、それぞれ、単一のSQL問合せと関連付けられます。構成では、SQL問合せが実行されるデータベースを表すデータ・ソースも指定されます。各関数には、その関数を定義するSQL問合せに引数を渡すのに使用される入力パラメータが含まれ、また、関数によってreturn-component-typeが指定されます。この関数への呼出しは常にTABLE句内に含められるので、関数は常にコレクション型を返します。return-component-typeプロパティでは、そのコレクションのコンポーネントのタイプが指定されます。

    例17-3に示すように、nameプロパティの値は、EPNファイル内でid属性に使用される値と一致する必要があります。

    例17-4に、Oracle CQL問合せでのjdbc:jbdc-contextへの参照方法を示します。この場合、問合せでは、リンク名JdbcCartridgeOne(例17-3で定義済)を使用して、このアプリケーション・コンテキストがOracle CEP JDBCデータ・カートリッジに伝播されます。例17-4では、Oracle CQL問合せによって、Oracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストJdbcCartridgeOneに関連付けられている関数getDetailsByOrderIdNameが呼び出されます。

    例17-4 コンポーネント構成ファイル内のjc:jdbc-ctx要素

    ...
    <jc:jdbc-ctx>
        <name>JdbcCartridgeOne</name> 
        <data-source>StockDS</data-source>
        <function name="getDetailsByOrderIdName">
            <param name="inpOrderId" type="int" />
            <param name="inpName" type="char" />
            <return-component-type>
                com.oracle.cep.example.jdbc_cartridge.RetEvent
            </return-component-type>
            <sql><![CDATA[
                SELECT
                    Employee.empName as employeeName,
                    Employee.empEmail as employeeEmail,
                    OrderDetails.description as description
                FROM
                     PlacedOrders, OrderDetails , Employee
                WHERE
                    PlacedOrders.empId = Employee.empId AND
                    PlacedOrders.orderId = OrderDetails.orderId AND
                    Employee.empName = :inpName AND
                    PlacedOrders.orderId = :inpOrderId
            ]]></sql>
        </function>
    </jc:jdbc-ctx>
    ...
    <processor>
            <name>Proc</name>
            <rules>
                <query id="q1"><![CDATA[
                    RStream(
                       select
                         currentOrder.orderId,
                         details.orderInfo.employeeName,
                         details.orderInfo.employeeemail,
                         details.orderInfo.description
                       from
                         OrderArrival[now] as currentOrder,
                         TABLE(getDetailsByOrderIdName@JdbcCartridgeOne(
                                   currentOrder.orderId, currentOrder.empName
                               ) as orderInfo
                         ) as details
                    )
                ]]></query>
            </rules>
    </processor>
    ...
    

詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストの構成方法に関する項を参照してください。

17.2 Oracle CEP JDBCデータ・カートリッジの使用

一般に、Oracle CEP JDBCデータ・カートリッジは次のように使用します。

  1. Oracle CEP JDBCデータ・カートリッジ・コンテキストによって参照されるOracle CEPサーバーconfig.xmlファイルでデータ・ソースを定義します。例17-4に示すように、Oracle CEPサーバーconfig.xmlでの定義中、データ・ソースによって使用される名前は、data-sourceプロパティを使用して、JDBCカートリッジ・コンテキストの構成中に使用されます。


    注意:

    Oracle CEP JDBCデータ・カートリッジを使用するには、データ・ソースでOracle JDBCのドライバ・バージョン11.2以上が使用される必要があります。

    Oracle CEPにバンドルされているOracle JDBCのドライバ・バージョン11.2をOracle CEPサーバーのconfig.xmlファイルで使用するには、例17-5に示すように、このドライバ・バージョン用のdata-source要素を作成し、driver-params子要素を追加します。

    例17-5 driver-params子要素

        <driver-params>
          <url>jdbc:oracle:thin:@lcw2k18:1531:lcw101</url>
          <driver-name>oracle.jdbc.xa.client.OracleXADataSource</driver-name
          <properties>
            <element><name>user</name><value>scott</value></element>
            <element><name>password</name><value>{3DES}EoIfSBMhnW8=</value></element>
            <element><name>com.bea.core.datasource.serviceName</name><value>oracle11.2g</value></element>
            <element><name>com.bea.core.datasource.serviceVersion</name><value>11.2.0</value></element>
            <element><name>com.bea.core.datasource.serviceObjectClass</name><value>java.sql.Driver</value></element>
          </properties>
          <use-xa-data-source-interface>true</use-xa-data-source-interface>
        </driver-params>
    

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

    • 『Oracle Complex Event Processing管理者ガイド』のOracle CEPのキャッシュの構成に関する項

    • 『Oracle Complex Event Processing管理者ガイド』の別のデータベース・ドライバまたはドライバのバージョンへのアクセスの構成に関する項

  2. Oracle CEP JDBCカートリッジ・アプリケーションの有効範囲内にあるコンテキストを宣言および定義します。

    詳細は、17.1.4項「Oracle CEP JDBCデータ・カートリッジのアプリケーション・コンテキスト」を参照してください。

  3. コンポーネント構成ファイル内のjc:jdbc-ctx要素で、1つ以上のSQL文を定義します。

    詳細は、17.2.1,項「SQL文の定義: function要素」を参照してください。

  4. function要素のreturn-component-type子要素をJava Beansとして指定する場合は、Java Beansを実装し、クラスがOracle CEPアプリケーション・クラスパス上に存在することを確認します。

    例17-6に、一般的な実装を示します。

    例17-6 return-component-typeクラスの例

    package com.oracle.cep.example.jdbc_cartridge;
     
    public class RetEvent
    {
        public String employeeName;
        public String employeeEmail;
        public String description;
    
        /* Default constructor is mandatory */
        public RetEvent1() {}
    
        /* May contain getters and setters for the fields */
    
        public String getEmployeeName() {
            return this.employeeName;
        }
    
        public void setEmployeeName(String employeeName) {
            this.employeeName = employeeName;
        }
    
        ...
    
        /* May contain other helper methods */
    
        public int getEmployeeNameLength() {
            return employeeName.length();
        }
    }
    

    フィールドはパブリックとして宣言する必要があります。

    JDBCカートリッジ・コンテキスト関数のreturn-component-typeクラスが、SQL問合せのSELECTリスト内のフィールドの1対1マッピングを持つ必要があります。つまり、関数を定義するSQL問合せのSELECTリスト内にあるすべてのフィールドが、その関数のreturn-component-typeであると宣言されるJavaクラス内に対応するフィールド(名前が一致する)を持つ必要があり、持たない場合はOracle CEPでエラーが発生します。たとえば、例17-4に示す関数内のSELECT項目が、どのように例17-6のフィールド名と一致するか確認します。

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

  5. Oracle CQL TABLE句を使用してjc:jdbc-ctx要素で定義されるSQL文を呼び出し、SQLSELECTリストの別名で返される結果にアクセスする、1つ以上のOracle CQL問合せを定義します。

    詳細は、17.2.2項「Oracle CEP JDBCデータ・カートリッジを使用したOracle CQL問合せの定義」を参照してください。

17.2.1 SQL文の定義: function要素

例17-7に示すように、コンポーネント構成ファイルのjc:jdbc-cxt要素内で、function子要素を使用してJDBCカートリッジ・コンテキストを定義できます。

例17-7 Oracle CEP JDBCデータ・カートリッジのSQL文

...
<jc:jdbc-ctx>
    <name>JdbcCartridgeOne</name> 
    <data-source>StockDS</data-source>
    <function name="getDetailsByOrderIdName">
        <param name="inpOrderId" type="int" />
        <param name="inpName" type="char" />
        <return-component-type>
            com.oracle.cep.example.jdbc_cartridge.RetEvent
        </return-component-type>
        <sql><![CDATA[
            SELECT
                Employee.empName as employeeName,
                Employee.empEmail as employeeEmail,
                OrderDetails.description as description
            FROM
                 PlacedOrders, OrderDetails , Employee
            WHERE
                PlacedOrders.empId = Employee.empId AND
                PlacedOrders.orderId = OrderDetails.orderId AND
                Employee.empName = :inpName AND
                PlacedOrders.orderId = :inpOrderId
        ]]></sql>
    </function>
</jc:jdbc-ctx>
...

指定するjc:jdbc-cxt要素内で1つ以上のfunction要素を定義できます。

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

17.2.1.1 function要素の属性

function要素では、表17-1にリストされている属性がサポートされます。

表17-1 function要素の属性

属性 説明

name

JDBCカートリッジ・コンテキスト関数の名前。

名前とシグネチャの組合せは、指定するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキスト内で一意である必要があります。詳細は、17.2.1.3.4項「JDBCカートリッジ・コンテキスト関数のオーバーロード」を参照してください。


17.2.1.2 function要素の子要素

function要素では、次の子要素がサポートされます。

17.2.1.2.1 param

param子要素では、オプションの入力パラメータが指定されます。

SQL文では、ゼロ以上のパラメータを使用できます。各パラメータはparam要素内で定義されます。

param子要素では、表17-2にリストされている属性がサポートされます。

表17-2 param要素の属性

属性 説明

name

入力パラメータの名前。

有効なパラメータ名は、A~Z、a~z、0~9および_(アンダースコア)の組合せで構成されます。

type

パラメータのデータ型。


データ型サポート: 入力パラメータparam要素のtype属性には、Oracle CQLネイティブのcom.bea.wlevs.ede.api.Typeデータ型のみを指定できます。


注意:

データ型の名前では大/小文字が区別されます。com.bea.wlevs.ede.api.Typeクラスで指定される文字を使用します。

詳細は、表17-3を参照してください。

17.2.1.2.2 return-component-type

return-component-type子要素では、関数の戻り値が指定されます。この子要素は必須です。

JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプを表します。この関数は常にOracle CQL TABLE句内から呼び出され、常にコレクション型を返します。

詳細は、17.2.2.2項「TABLE句の使用」を参照してください。

データ型サポート: 次のいずれかの型をreturn-component-type要素の値として指定できます。

  • Oracle CQLネイティブのcom.bea.wlevs.ede.api.Typeデータ型。

  • Java Beans など、Oracle CQL拡張可能Javaカートリッジ型。

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

17.2.1.2.3 sql

sql子要素では、SQL文が指定されます。この子要素は必須です。

function要素には、単一行のSQL文を1つのみ含めることができます。SQL文自体は<![CDATA[]]>ブロック内で定義します。

例17-7に示すように、SQL文内で、コロン(:)接頭辞を使用して、param要素のname属性により入力パラメータを指定します。


注意:

JDBCカートリッジ・コンテキスト関数内のすべてのSELECTリスト列に別名を指定する必要があります。

データ型サポート: 表17-3に、お使いのOracle CEP JDBCデータ・カートリッジ・コンテキスト関数で使用可能なSQLタイプ、それぞれ対応するOracle CEP Javaタイプおよびcom.bea.wlevs.ede.api.Type型のリストを示します。

表17-3 SQL列タイプおよびOracle CEPタイプの対応するもの

SQLタイプ Oracle CEP Javaタイプ com.bea.wlevs.ede.api.Type

NUMBER

java.math.BigDecimal

bigdecimal

NUMBER

long

bigint

RAW

byte[]

byte

CHARVARCHAR

java.lang.String

char

NUMBER

double

double

FLOATNUMBER

float

float

INTEGERNUMBER

int

int

TIMESTAMP

java.sql.Timestamp

timestamp



注意:

JavaタイプのサイズがSQLタイプのサイズを超える場合、Oracle CEPアプリケーションで、SQLタイプの最大サイズの値を制限する必要があります。CQL側で使用されるタイプの選択は、データベース列内の値の範囲で決定されるようにします。たとえば、SQL列が、整数の範囲の値が含まれている数値である場合、CQL側で"int"タイプを使用します。誤ったタイプを選択し、値が範囲外となった場合、Oracle CEPで数値オーバーフローのエラーが発生します。


注意:

Oracle CEP JDBCデータ・カートリッジでは、Oracle Spatialデータ型はサポートされません。

詳細は、17.2.1.3項「function要素の使用法」を参照してください。

17.2.1.3 function要素の使用法

この項では、次のように、Oracle CEP JDBCデータ・カートリッジを使用して定義可能な別のJDBCカートリッジ・コンテキスト関数の例を示します。

17.2.1.3.1 複数のパラメータのあるJDBCカートリッジ・コンテキスト関数

Oracle CEP JDBCデータ・カートリッジを使用して、複数の入力パラメータを使用するJDBCカートリッジ・コンテキスト関数を定義できます。

例17-8に、2つの入力パラメータを使用するJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。

例17-8 複数のパラメータのあるOracle JDBCデータ・カートリッジ・コンテキスト関数

...
<function name="getDetailsByOrderIdName">
    <param name="inpOrderId" type="int" />
    <param name="inpName" type="char" />
    <return-component-type>
        com.oracle.cep.example.jdbc_cartridge.RetEvent
    </return-component-type>
    <sql><![CDATA[
              SELECT
                    Employee.empName as employeeName,
                    Employee.empEmail as employeeEmail,
                    OrderDetails.description as description
              FROM
                     PlacedOrders, OrderDetails , Employee
              WHERE
                    PlacedOrders.empId = Employee.empId AND
                    PlacedOrders.orderId = OrderDetails.orderId AND
                    Employee.empName = :inpName AND
                    PlacedOrders.orderId = :inpOrderId
    ]]></sql>
</function>
...
17.2.1.3.2 PL/SQL関数の呼出し

Oracle CEP JDBCデータ・カートリッジを使用して、データベースが定義するPL/SQL関数を呼び出すJDBCカートリッジ・コンテキスト関数を定義できます。

例17-9に、PL/SQL関数getOrderAmtを呼び出すJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。

例17-9 PL/SQL関数を呼び出すOracle JDBCデータ・カートリッジ・コンテキスト関数

...
<function name="getOrderAmount">
    <param name="inpId" type="int" />
    <return-component-type>
        com.oracle.cep.example.jdbc_cartridge.RetEvent
    </return-component-type>
    <sql><![CDATA[
            SELECT getOrderAmt(:inpId) as orderAmt
            FROM dual 
    ]]></sql>
</function>
...
17.2.1.3.3 複雑なJDBCカートリッジ・コンテキスト関数

Oracle CEP JDBCデータ・カートリッジを使用して、副問合せ、統計、GROUP BYORDER BYおよびHAVINGなど、任意の複雑なJDBCカートリッジ・コンテキスト関数を定義できます。

例17-10に、複雑なJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。

例17-10 Oracle CEP JDBCデータ・カートリッジの複雑なJDBCカートリッジ・コンテキスト関数

...
<function name="getHighValueOrdersPerEmp">
    <param name="limit" type="int"/>
    <param name="inpName" type="char"/>
    <return-component-type>
        com.oracle.cep.example.jdbc_cartridge.RetEvent
    </return-component-type>
        <sql><![CDATA[
            select description as description,  sum(amt) as totalamt, count(*) as numTimes
            from  OrderDetails
                where orderid in (
                    select orderid from PlacedOrders where empid in (
                        select empid from Employee where  empName = :inpName
                    )
                )
            group by description 
            having sum(amt) > :limit
        ]]></sql>
</function> 
...
17.2.1.3.4 JDBCカートリッジ・コンテキスト関数のオーバーロード

Oracle CEP JDBCデータ・カートリッジを使用して、各関数が一意のシグネチャを持つ場合、同じアプリケーション・コンテキスト内に同じ名前のJDBCカートリッジ・コンテキスト関数を定義できます。

例17-11に、getDetailsという名前の2つのJDBCカートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。各関数は、一意のシグネチャで識別されます。

例17-11 Oracle JDBCデータ・カートリッジ・コンテキスト関数のオーバーロード

<jc:jdbc-ctx>
    <name>JdbcCartridgeOne</name> 
    <data-source>StockDS</data-source>
         <function name="getDetails">
            <param name="inpName" type="char" />
            <return-component-type>
                com.oracle.cep.example.jdbc_cartridge.RetEvent
            </return-component-type>
            <sql><![CDATA[
                      SELECT
                             Employee.empName as employeeName,
                             Employee.empEmail as employeeEmail,
                             OrderDetails.description as description
                      FROM
                             PlacedOrders, OrderDetails , Employee
                      WHERE
                             PlacedOrders.empId = Employee.empId AND
                             PlacedOrders.orderId = OrderDetails.orderId AND
                             Employee.empName=:inpName
                      ORDER BY <!—SQL query using ORDER BY -->
                        description desc
            ]]></sql>
        </function>
        <function name="getDetails">
            <param name="inpOrderId" type="int" />
            <sql><![CDATA[
                      SELECT
                             Employee.empName as employeeName,
                             Employee.empEmail as employeeEmail,
                             OrderDetails.description as description
                      FROM
                             PlacedOrders, OrderDetails , Employee
                      WHERE
                             PlacedOrders.empId= Employee.empId AND
                             PlacedOrders.orderId = OrderDetails.orderId AND
                             PlacedOrders.orderId = :inpOrderId
            ]]></sql>
        </function>
</jc:jdbc-ctx>

17.2.2 Oracle CEP JDBCデータ・カートリッジを使用したOracle CQL問合せの定義

この項では、次のように、Oracle CEP JDBCデータ・カートリッジを使用しててSQL文を呼び出すOracle CQL問合せの定義方法について説明します。

詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのOracle CQLプロセッサの構成に関する項を参照してください。

17.2.2.1 Selectリストの別名の使用

例17-12に示すようなOracle CEP JDBCデータ・カートリッジ・コンテキスト関数があるとします。

例17-12 Oracle CEP JDBCデータ・カートリッジ・コンテキスト関数

<jc:jdbc-ctx>
    <name>JdbcCartridgeOne</name> 
    <data-source>StockDS</data-source>
        <function name="getDetailsByOrderIdName">
            <param name="inpOrderId" type="int" />
            <param name="inpName" type="char" />
            <return-component-type>
                com.oracle.cep.example.jdbc_cartridge.RetEvent
            </return-component-type>
            <sql><![CDATA[
                    SELECT
                            Employee.empName as employeeName,
                            Employee.empEmail as employeeEmail,
                            OrderDetails.description as description
                    FROM
                            PlacedOrders, OrderDetails , Employee
                    WHERE
                            PlacedOrders.empId = Employee.empId AND
                            PlacedOrders.orderId = OrderDetails.orderId AND
                            Employee.empName = :inpName AND
                            PlacedOrders.orderId = :inpOrderId
            ]]></sql>
        </function>
</jc:jdbc-ctx>

SELECTリスト内の各列に別名を指定する必要があります。Oracle CQL問合せ内のJDBCカートリッジ・コンテキスト関数を呼び出す際、これらのSELECTリストの別名で、結果セット内の列にアクセスします。

詳細は、17.2.2.2項「TABLE句の使用」を参照してください。

17.2.2.2 TABLE句の使用

例17-13に示すようなOracle CEP JDBCデータ・カートリッジのSQL文があるとします。

例17-13 Oracle CEP JDBCデータ・カートリッジのSQL文

...
<jc:jdbc-ctx>
    <name>JdbcCartridgeOne</name> 
    <data-source>StockDS</data-source>
    <function name="getDetailsByOrderIdName">
        <param name="inpOrderId" type="int" />
        <param name="inpName" type="char" />
        <return-component-type>
            com.oracle.cep.example.jdbc_cartridge.RetEvent
        </return-component-type>
        <sql><![CDATA[
            SELECT
                Employee.empName as employeeName,
                Employee.empEmail as employeeEmail,
                OrderDetails.description as description
            FROM
                 PlacedOrders, OrderDetails , Employee
            WHERE
                PlacedOrders.empId = Employee.empId AND
                PlacedOrders.orderId = OrderDetails.orderId AND
                Employee.empName = :inpName AND
                PlacedOrders.orderId = :inpOrderId
        ]]></sql>
    </function>
</jc:jdbc-ctx>
...

例17-14のOracle CQL問合せにより、例17-13で定義されるJDBCカートリッジ・コンテキスト関数が呼び出されます。

例17-14 Oracle CEP JDBCデータ・カートリッジ・コンテキスト関数を呼び出すOracle CQL問合せ

<processor>
        <name>Proc</name>
        <rules>
            <query id="q1"><![CDATA[
                RStream(
                   select
                     currentOrder.orderId,
                     details.orderInfo.employeeName,
                     details.orderInfo.employeeemail,
                     details.orderInfo.description
                     details.orderInfo.getEmployeeNameLength()
                   from
                     OrderArrival[now] as currentOrder,
                     TABLE(getDetailsByOrderIdName@JdbcCartridgeOne(
                               currentOrder.orderId, currentOrder.empName
                           ) as orderInfo
                     ) as details
                )
            ]]></query>
        </rules>
</processor>

Oracle CEP JDBCデータ・カートリッジ・コンテキスト関数の呼出しは、Oracle CQL問合せのTABLE句にラップする必要があります。

次を使用して結果セットにアクセスします。

TABLE_CLAUSE_ALIAS.JDBC_CARTRIDGE_FUNCTION_ALIAS.SQL_SELECT_LIST_ALIAS
or
TABLE_CLAUSE_ALIAS.JDBC_CARTRIDGE_FUNCTION_ALIAS.METHOD_NAME

説明:

  • TABLE_CLAUSE_ALIAS: TABLE句の外部のAS別名。

    例17-14では、detailsです。

  • JDBC_CARTRIDGE_FUNCTION_ALIAS: JDBCカートリッジ・コンテキスト関数の内部のAS別名。

    例17-14では、oderInfoです。

  • SQL_SELECT_LIST_ALIAS: JDBCカートリッジ・コンテキスト関数のSELECTリストの別名。

    例17-13では、employeeName、<employeeEmailおよびdescriptionです。

  • METHOD_NAME: return-component-typeクラスによって指定されるメソッドの名前。

    例17-14では、getEmployeeNameLength()です。

例17-14に示すように、次を使用してOracle CQL問合せ内のJDBCカートリッジ・コンテキスト関数の結果セットにアクセスします。

details.orderInfo.employeeName
details.orderInfo.employeeemail
details.orderInfo.description
details.orderInfo.getEmployeeNameLength()

JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプは、function要素のreturn-component-type子要素で定義されます。この関数は、常にOracle CQL TABLE句内から呼び出されるので、常にコレクション型を返します。例17-14で呼び出されるgetDetailsByORderIdName JDBCカートリッジ・コンテキスト関数が例17-13に示すように定義される場合、orderInfocom.oracle.cep.example.jdbc_cartridge.RetEvent型になります。

return-component-typeのフィールドとメソッドは両方ともOracle CQL問合せでアクセスできます。例17-13では、return-component-typeによって例17-15で示すように実装されるJava Beansが指定されています。

例17-15 return-component-typeクラスの例

package com.oracle.cep.example.jdbc_cartridge;
 
public class RetEvent
{
    String employeeName;
    String employeeEmail;
    String description;

    /* Default constructor is mandatory */
    public RetEvent1() {}

    /* May contain getters and setters for the fields */

    public String getEmployeeName() {
        return this.employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    ...

    /* May contain other helper methods */

    public int getEmployeeNameLength() {
        return employeeName.length();
    }
}

このクラスでは、Oracle CQL問合せ内で呼出し可能な、getEmployeeNameLengthなどのヘルパー・メソッドが指定されます。

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

17.2.2.3 return-component-typeとしてのネイティブCQLタイプの使用

次は、ネイティブCQLタイプbigintをreturn-component-typeとして持つ関数を定義するJDBCカートリッジ・コンテキストです。

例17-16 return-component-typeとしてのCQLタイプbigint

<jc:jdbc-ctx>
    <name>JdbcCartridgeOne</name>
    <data-source>myJdbcDataSource</data-source>
    <function name="getOrderAmt">
       <param name="inpId" type="int" />
       <return-component-type>bigint</return-component-type> <!-- native CQL as return component type -->
       <sql><![CDATA[
                SELECT
                  getOrderAmt(:inpId) as orderAmt
                FROM (select :inpId as iid from
                  dual)]]>
       </sql>
    </function>
</jc:jdbc-ctx>

例17-17に、例17-16getOrderAmt関数のCQL問合せ内における使用方法を示します。

例17-17 CQL問合せ内のgetOrderAmt関数

<query id="q1"><![CDATA[
                 RStream(
                   select
                     currentOrder.orderId,
                     details.orderInfo as orderAmt
                   from
                     OrderArrival[now] as currentOrder,
                     TABLE(getOrderAmt@JdbcCartridgeTwo(currentOrder.orderId) as orderInfo of bigint) as details
                 )
 ]]></query>

別名orderInfo自体はbigint型であり、CQL問合せのselectリスト内ではdetails.orderInfo as orderAmtとしてアクセスできます。

TABLEコンストラクト内で使用される"of bigint"句はオプションです。指定される場合、例17-16内のbigintのように、記述されるタイプがreturn-component-typeと一致する必要があります。