| Oracle® Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス 11gリリース1 (11.1.1.6.2) B61613-04 |
|
![]() 前 |
![]() 次 |
この章では、Oracle Continuous Query Language (Oracle CQL)の拡張であるOracle CEP JDBCデータ・カートリッジについて説明します。このデータ・カートリッジによって、データベースに対してSQL問合せを実行し、返された結果をCQL問合せで使用できます。
カートリッジの機能を使用する場合、SQL問合せをJDBCカートリッジ関数の定義と関連付けます。その後、CQL問合せから、関連付けられているSQL問合せをデータベースに対して実行するJDBCカートリッジ関数の呼出しが可能になります。この関数呼出しは、その関数呼出しを行うCQL問合せ内のCQLリレーションとしてSQL問合せの結果を使用できるようにするため、TABLE句内に含める必要があります。
TABLE句の詳細は、17.2.2.2項「TABLE句の使用」を参照してください。
この章の内容は、次のとおりです。
詳細は、以下を参照してください。
Oracle CEPストリームにはストリーミング・データが含まれ、通常、データベースには履歴データが格納されます。Oracle CEP JDBCデータ・カートリッジを使用して、履歴データ(1つ以上の表内に格納される)をOracle CEPストリームからのストリーミング・データと関連付けます。Oracle CEP JDBCデータ・カートリッジは、データベースに対して任意のSQL問合せを実行し、CQL問合せの結果を使用します。この項では、Oracle CEP JDBCデータ・カートリッジを使用して、ストリーミング・データと履歴データを関連付ける方法について説明します。
この項の内容は、次のとおりです。
Oracle CEP JDBCデータ・カートリッジでは、カートリッジIDcom.oracle.cep.cartrdige.jdbcが使用されます。このIDは予約されるので、他のカートリッジによって使用されません。
詳細は、17.1.4項「Oracle CEP JDBCデータ・カートリッジのアプリケーション・コンテキスト」を参照してください。
Oracle CEP JDBCデータ・カートリッジでは、任意の複雑なSQL文が次の制限下でサポートされます。
SQL問合せのSELECTリスト内のネイティブSQLタイプのみを使用できます。
SELECTリスト内のユーザー定義タイプおよび複雑なデータベース・タイプは使用できません。
SQL問合せ内のすべてのSELECTリスト列に別名を指定する必要があります。
詳細は、17.1.3項「データ型マッピング」を参照してください。
|
注意: Oracle CEP JDBCデータ・カートリッジを使用するには、データ・ソースでOracle JDBCのドライバ・バージョン11.2以上が使用される必要があります。 詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing管理者ガイド』の異なるデータベース・ドライバまたはドライバ・バージョンへのアクセスの構成に関する項を参照してください。 |
この項では、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項「有効範囲」を参照してください。
Oracle CEP JDBCデータ・カートリッジを使用するには、次の手順で説明するように、アプリケーションの開発中に、1つ以上のアプリケーションの有効範囲内にあるJDBCカートリッジ・コンテキストを宣言または構成する必要があります。
EPNファイル内でのJDBCカートリッジ・コンテキストの宣言手順:
例17-2に示すように、必須のネームスペースおよびスキーマの場所のエントリを追加するように、Oracle CEPアプリケーションEPNアセンブリ・ファイルを編集します。
例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_6.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データ・カートリッジ・アプリケーション・コンテキストの作成方法を示します。
JDBCカートリッジ・コンテキストを構成するには、通常、アプリケーションの/wlevsディレクトリ内にあるコンポーネント構成ファイル内に構成の詳細を追加します。この構成は、チャネルおよびプロセッサなどの他のEPNコンポーネントの構成と同様です。
アプリケーション構成ファイル内でのJDBCカートリッジ・コンテキストの構成手順:
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">
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>
...
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing開発者ガイド for Eclipse』のOracle CEP JDBCデータ・カートリッジのアプリケーション・コンテキストの構成方法に関する項を参照してください。
一般に、Oracle CEP JDBCデータ・カートリッジは次のように使用します。
Oracle CEP JDBCカートリッジ・アプリケーションの有効範囲内にあるコンテキストを宣言および定義します。
詳細は、17.1.4項「Oracle CEP JDBCデータ・カートリッジのアプリケーション・コンテキスト」を参照してください。
コンポーネント構成ファイル内のjc:jdbc-ctx要素で、1つ以上のSQL文を定義します。
詳細は、17.2.1,項「SQL文の定義: function要素」を参照してください。
function要素のreturn-component-type子要素をJava beanとして指定する場合は、そのbeanを実装し、クラスがOracle CEPアプリケーション・クラスパス上に存在するようにします。
例17-5に、一般的な実装を示します。
例17-5 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-5のフィールド名と一致するか確認します。
詳細は、以下を参照してください。
『Oracle Fusion Middleware Oracle Complex Event Processing開発者ガイド for Eclipse』のOracle CEP IDE for Eclipseのプロジェクトに関する項
Oracle CQL TABLE句を使用してjc:jdbc-ctx要素で定義されるSQL文を呼び出し、SQLSELECTリストの別名で返される結果にアクセスする、1つ以上のOracle CQL問合せを定義します。
詳細は、17.2.2項「Oracle CEP JDBCデータ・カートリッジを使用したOracle CQL問合せの定義」を参照してください。
例17-6に示すように、コンポーネント構成ファイルのjc:jdbc-cxt要素内で、function子要素を使用してJDBCカートリッジ・コンテキスト関数を定義できます。
例17-6 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要素を定義できます。
この項の内容は、次のとおりです。
各function要素では、表17-1にリストされている属性がサポートされます。
表17-1 function要素の属性
| 属性 | 説明 |
|---|---|
|
|
JDBCカートリッジ・コンテキスト関数の名前。 名前とシグネチャの組合せは、指定するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキスト内で一意である必要があります。詳細は、17.2.1.3.4項「JDBCカートリッジ・コンテキスト関数のオーバーロード」を参照してください。 |
各function要素では、次の子要素がサポートされます。
param子要素では、オプションの入力パラメータが指定されます。
SQL文では、ゼロ以上のパラメータを使用できます。各パラメータはparam要素内で定義されます。
各param子要素では、表17-2にリストされている属性がサポートされます。
表17-2 param要素の属性
| 属性 | 説明 |
|---|---|
|
|
入力パラメータの名前。 有効なパラメータ名は、A-Z、a-z、0-9および_(アンダースコア)の組合せで構成されます。 |
|
|
パラメータのデータ型。 |
データ型サポート: 入力パラメータparam要素のtype属性には、Oracle CQLネイティブのcom.bea.wlevs.ede.api.Typeデータ型のみを指定できます。
|
注意: データ型の名前では大/小文字が区別されます。 |
詳細は、表17-3を参照してください。
return-component-type子要素では、関数の戻り値が指定されます。この子要素は必須です。
JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプを表します。この関数は常にOracle CQL TABLE句内から呼び出され、常にコレクション型を返します。
詳細は、17.2.2.2項「TABLE句の使用」を参照してください。
データ型サポート: 次のいずれかの型をreturn-component-type要素の値として指定できます。
Oracle CQLネイティブのcom.bea.wlevs.ede.api.Typeデータ型。
Java beanなどの、Oracle CQL拡張可能Javaカートリッジ型。
詳細は、以下を参照してください。
sql子要素では、SQL文が指定されます。この子要素は必須です。
各function要素には、単一行のSQL文を1つのみ含めることができます。SQL文自体は<![CDATA[]]>ブロック内で定義します。
例17-6に示すように、SQL文内で、コロン(:)接頭辞を使用して、param要素のname属性により入力パラメータを指定します。
|
注意: JDBCカートリッジ・コンテキスト関数内のすべての |
データ型サポート: 表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 |
|---|---|---|
|
|
|
bigdecimal |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意: JavaタイプのサイズがSQLタイプのサイズを超える場合、Oracle CEPアプリケーションで、SQLタイプの最大サイズの値を制限する必要があります。CQL側で使用されるタイプの選択は、データベース列内の値の範囲で決定されるようにします。たとえば、SQL列が、整数の範囲の値が含まれている数値である場合、CQL側で"int"タイプを使用します。誤ったタイプを選択し、値が範囲外となった場合、Oracle CEPで数値オーバーフローのエラーが発生します。 |
|
注意: Oracle CEP JDBCデータ・カートリッジでは、Oracle Spatialデータ型はサポートされません。 |
詳細は、17.2.1.3項「function要素の使用法」を参照してください。
この項では、次のように、Oracle CEP JDBCデータ・カートリッジを使用して定義可能な別のJDBCカートリッジ・コンテキスト関数の例を示します。
Oracle CEP JDBCデータ・カートリッジを使用して、複数の入力パラメータを使用するJDBCカートリッジ・コンテキスト関数を定義できます。
例17-7に、2つの入力パラメータを使用するJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。
例17-7 複数のパラメータのある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>
...
Oracle CEP JDBCデータ・カートリッジを使用して、データベースが定義するPL/SQL関数を呼び出すJDBCカートリッジ・コンテキスト関数を定義できます。
例17-8に、PL/SQL関数getOrderAmtを呼び出すJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。
例17-8 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>
...
Oracle CEP JDBCデータ・カートリッジを使用して、副問合せ、統計、GROUP BY、ORDER BYおよびHAVINGなど、任意の複雑なJDBCカートリッジ・コンテキスト関数を定義できます。
例17-9に、複雑なJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。
例17-9 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>
...
Oracle CEP JDBCデータ・カートリッジを使用して、各関数が一意のシグネチャを持つ場合、同じアプリケーション・コンテキスト内に同じ名前のJDBCカートリッジ・コンテキスト関数を定義できます。
例17-10に、getDetailsという名前の2つのJDBCカートリッジ・コンテキスト関数を定義するOracle CEP JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。各関数は、一意のシグネチャで識別されます。
例17-10 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>
この項では、次のように、Oracle CEP JDBCデータ・カートリッジを使用しててSQL文を呼び出すOracle CQL問合せの定義方法について説明します。
詳細は、『Oracle Fusion Middleware Oracle Complex Event Processing開発者ガイド for Eclipse』のOracle CQLプロセッサの構成に関する項を参照してください。
例17-11に示すようなOracle CEP JDBCデータ・カートリッジ・コンテキスト関数があるとします。
例17-11 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-12に示すようなOracle CEP JDBCデータ・カートリッジのSQL文があるとします。
例17-12 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-13のOracle CQL問合せにより、例17-12で定義されるJDBCカートリッジ・コンテキスト関数が呼び出されます。
例17-13 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_ALIASorTABLE_CLAUSE_ALIAS.JDBC_CARTRIDGE_FUNCTION_ALIAS.METHOD_NAME
説明:
TABLE_CLAUSE_ALIAS: TABLE句の外部のAS別名。
例17-13では、detailsです。
JDBC_CARTRIDGE_FUNCTION_ALIAS: JDBCカートリッジ・コンテキスト関数の内部のAS別名。
例17-13では、orderInfoです。
SQL_SELECT_LIST_ALIAS: JDBCカートリッジ・コンテキスト関数のSELECTリストの別名。
例17-12では、employeeName、employeeEmailおよびdescriptionです。
METHOD_NAME: return-component-typeクラスによって指定されるメソッドの名前。
例17-13では、getEmployeeNameLength()です。
例17-13に示すように、次を使用してOracle CQL問合せ内のJDBCカートリッジ・コンテキスト関数の結果セットにアクセスします。
details.orderInfo.employeeName details.orderInfo.employeeemail details.orderInfo.description details.orderInfo.getEmployeeNameLength()
JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプは、function要素のreturn-component-type子要素で定義されます。この関数は常にOracle CQL TABLE句内から呼び出され、常にコレクション型を返します。例17-13で呼び出されるgetDetailsByORderIdName JDBCカートリッジ・コンテキスト関数が例17-12に示すように定義される場合、orderInfoはcom.oracle.cep.example.jdbc_cartridge.RetEvent型になります。
return-component-typeのフィールドとメソッドは両方ともOracle CQL問合せでアクセスできます。例17-12では、return-component-typeによって例17-14で示すように実装されるJava beanが指定されています。
例17-14 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などのヘルパー・メソッドが指定されます。
詳細は、以下を参照してください。
次は、ネイティブCQLタイプbigintをreturn-component-typeとして持つ関数を定義するJDBCカートリッジ・コンテキストです。
例17-15 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-16に、例17-15のgetOrderAmt関数のCQL問合せ内における使用方法を示します。
例17-16 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-15内のbigintのように、記述されるタイプがreturn-component-typeと一致する必要があります。