プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle CQLデータ・カートリッジによるアプリケーションの開発
12c リリース(12.1.3)
E57539-03
目次へ移動
目次

前
前へ
次
次へ

3 Oracle JDBCデータ・カートリッジ

Oracle Event Processing JDBCデータ・カートリッジを使用すると、データベースに対してSQL問合せを実行し、戻り値をCQL問合せで使用できます。

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

注意:

Oracle CQL文からリレーショナル・データベース表にアクセスするにはOracle JDBCデータ・カートリッジを使用することをお薦めします。

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

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

3.1 Oracle Event Processing JDBCデータ・カートリッジについて

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

この項では、次の内容について説明します。

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

Oracle Event Processing JDBCデータ・カートリッジはカートリッジID com.oracle.cep.cartridge.jdbcを使用します。このIDは予約されるので、他のカートリッジによって使用されません。

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

3.1.2 スコープ

Oracle Event Processing JDBCデータ・カートリッジは、次の制限のもと、任意の複合SQL文をサポートします。

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

  • SELECTリストではユーザー定義型および複合型を使用できません。

  • SQL問合せの各SELECTリスト列でエイリアス名を使用できます。エイリアス名を使用する場合は、selectリストが戻り型のプロパティ名に一致するようにします。

注意:

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

3.1.3 パラメータの指定

JDBC関数のパラメータを指定するにはparam要素を使用します。パラメータはnamevalueのペアで指定します。name属性は指定されたtypeのイベント・データを指定します。type属性はOracle CQLデータ型になります。Oracle CQLデータ型の詳細は、Oracle Event Processing Oracle CQL言語リファレンスを参照してください。

次の例は、paramtypeペアを使用してgetDetailsByOrderIdName関数のパラメータを指定する構成ファイルの例を示しています。

注意:

この例で使用しているRetEventクラスは、表関数として複合型を返す方法の例です。このクラスの完全なコードは、「Oracle Event Processing 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>
...

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

Oracle Event Processing JDBCデータ・カートリッジを使用するには、アプリケーション開発時に、次の手順に従って1つ以上のアプリケーション・スコープJDBCカートリッジ・コンテキストを宣言および構成する必要があります。

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

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

  1. Oracle Event ProcessingアプリケーションEPNアセンブリ・ファイルを編集して、必要なネームスペースおよびスキーマの場所のエントリを追加します。
  2. EPNファイルにjdbc-contextタグのエントリを追加し、id属性を指定します。idは、このアプリケーションの有効範囲内にあるコンテキストの名前を示し、このコンテキストで定義されている関数を参照するCQL問合せで使用されます。idは、このコンテキストがアプリケーション構成ファイルで構成される際にも使用されます。
<?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/http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
  http://www.oracle.com/ns/ocep/jdbc
  http://www.oracle.com/ns/ocep/jdbc/ocep-jdbc.xsd">

次の例は、JdbcCartridgeOneという名前のOracle Event Processing JDBCデータ・カートリッジ・アプリケーション・コンテキストをEPNアセンブリ・ファイルに作成する方法を示しています。

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

3.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プロパティでは、そのコレクションのコンポーネントのタイプが指定されます。

    nameプロパティの値は、EPNファイルのid属性に使用される値と一致する必要があります。

    注意:

    この例で使用しているRetEventクラスは、表関数として複合型を返す方法の例です。このクラスの完全なコードは、「Oracle Event Processing 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>
    ...
    <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>
    ...
    

3.2 Oracle Event Processing JDBCデータ・カートリッジの使用

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

  1. Oracle Event Processing JDBCカートリッジ・アプリケーションの有効範囲内にあるコンテキストを宣言および定義します。
  2. コンポーネント構成ファイル内のjc:jdbc-ctx要素で、1つ以上のSQL文を定義します。

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

  3. function要素のreturn-component-type子要素をJava beanとして指定する場合は、そのbeanを実装し、クラスがOracle Event Processingアプリケーション・クラスパス上に存在するようにします。

    次の例は、標準的な実装を示しています。

    注意:

    RetEventクラスは、表関数として複合型を返す方法の例です。

    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 Event Processingでエラーが発生します。

    詳細は、return-component-typeを参照してください。

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

3.2.1 SQL文の定義: function要素

コンポーネント構成ファイルのjc:jdbc-cxt要素内でfunction子要素を使用して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>
...

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

この項では、次の内容について説明します。

3.2.1.1 function要素の属性

function要素は表3-1にリストされた属性をサポートしています。

表3-1 function要素の属性

属性 説明

name

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

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

3.2.1.2 function要素の子要素

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

3.2.1.2.1 param

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

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

param子要素は表3-2に示す属性をサポートしています。

表3-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クラスで指定される文字を使用します。

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

3.2.1.2.2 return-component-type

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

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

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

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

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

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

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

3.2.1.2.3 sql

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

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

SQL文では、param要素のname属性でコロン(:)接頭辞を使用して入力パラメータを指定します。

注意:

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

データ型のサポート: 表3-3は、Oracle Event Processing JDBCデータ・カートリッジ・コンテキスト関数で使用できるSQLの型、および対応するOracle Event Processing Java型とcom.bea.wlevs.ede.api.Type型の一覧です。

表3-3 SQLの列の型およびOracle Event Processingの対応型

SQL型 Oracle Event Processing 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 Event ProcessingアプリケーションでSQL型の最大サイズに値を制限する必要があります。CQL側で使用されるタイプの選択は、データベース列内の値の範囲で決定されるようにします。たとえば、SQL列が、整数の範囲の値が含まれている数値である場合、CQL側で"int"タイプを使用します。不正な型を選択したり範囲外の値を持った場合は、Oracle Event Processingは数値のオーバーフロー・エラーをスローします。

注意:

Oracle Event Processing JDBCデータ・カートリッジはOracle Spatialのデータ型をサポートしません。

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

3.2.1.3 function要素の使用方法

この項では、Oracle Event Processing JDBCデータ・カートリッジを使用して定義できる各種JDBCカートリッジ・コンテキスト関数の例を説明します。次の内容が含まれます。

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

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

次の例は、2つの入力パラメータを取るJDBCカートリッジ・コンテキスト関数を定義するOracle Event Processing 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>
...
3.2.1.3.2 PL/SQL関数の呼出し

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

次の例は、PL/SQL関数getOrderAmtを呼び出すJDBCカートリッジ・コンテキスト関数を定義するOracle Event Processing 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>
...
3.2.1.3.3 複雑なJDBCカートリッジ・コンテキスト関数

Oracle Event Processing JDBCデータ・カートリッジを使用して、サブ問合せ、集約、GROUP BYORDER BYおよびHAVINGを含む複合JDBCカートリッジ・コンテキスト関数を任意に定義できます。

次の例は、複合JDBCカートリッジ・コンテキスト関数を定義するOracle Event Processing 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> 
...
3.2.1.3.4 JDBCカートリッジ・コンテキスト関数のオーバーロード

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

次の例は、getDetailsという名前のJDBCカートリッジ・コンテキスト関数を2つ定義するOracle Event Processing 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
                        description desc
            ></sql>
        </function>
        <function name="getDetails">
            <param name="inpOrderId" type="int" />
            <sql><![CDATA[ return-component-type
                      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>

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

この項では、Oracle Event Processing JDBCデータ・カートリッジを使用して、SQL文を起動するOracle CQL問合せを定義する方法を説明します。次の内容が含まれます。

3.2.2.1 Selectリストの別名の使用

Oracle Event Processing 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リストの別名で、結果セット内の列にアクセスします。

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

3.2.2.2 TABLE句の使用

Oracle Event Processing 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>
...

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

<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 Event Processing 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別名。

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

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

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

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

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

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

return-component-typeのフィールドとメソッドは両方ともOracle CQL問合せでアクセスできます。

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などのヘルパー・メソッドが指定されます。

詳細は、「return-component-type」を参照してください。

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

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

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

次の例は、前述の例のgetOrderAmt関数のCQL問合せ内における使用方法を示しています。

<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"句はオプションです。使用された場合、指定されたタイプがreturn-component-typeに一致する必要があります。