この章では、Oracle Continuous Query Language (Oracle CQL)の拡張で、データベースに対してSQL問合せを実行し、返された結果をCQL問合せで使用するための、Oracle Event Processing JDBCデータ・カートリッジについて説明します。
カートリッジの機能を使用する場合、SQL問合せをJDBCカートリッジ関数の定義と関連付けます。その後、CQL問合せから、関連付けられているSQL問合せをデータベースに対して実行するJDBCカートリッジ関数の呼出しが可能になります。この関数呼出しは、その関数呼出しを行うCQL問合せ内のCQLリレーションとしてSQL問合せの結果を使用できるようにするため、TABLE句内に含める必要があります。
TABLE句の詳細は、17.2.2.2項「TABLE句の使用」を参照してください。
この章の内容は次のとおりです。
詳細は、次を参照してください。
Oracle Event Processingストリームにはストリーミング・データが含まれ、通常、データベースには履歴データが格納されます。Oracle Event Processing JDBCデータ・カートリッジを使用して、履歴データ(1つ以上の表内に格納される)をOracle Event Processingストリームからのストリーミング・データと関連付けます。Oracle Event Processing JDBCデータ・カートリッジは、データベースに対して任意のSQL問合せを実行し、CQL問合せの結果を使用します。この項では、Oracle Event Processing JDBCデータ・カートリッジを使用して、ストリーミング・データと履歴データを関連付ける方法について説明します。
この項の内容は、次のとおりです。
Oracle Event Processing JDBCデータ・カートリッジでは、カートリッジID com.oracle.cep.cartridge.jdbc
が使用されます。このIDは予約されるので、他のカートリッジによって使用されません。
詳細は、17.1.4項「Oracle Event Processing JDBCデータ・カートリッジのアプリケーション・コンテキスト」を参照してください。
Oracle Event Processing JDBCデータ・カートリッジでは、任意の複雑なSQL文が次の制限下でサポートされます。
SQL問合せのSELECT
リスト内のネイティブSQLタイプのみを使用できます。
SELECT
リスト内のユーザー定義タイプおよび複雑なデータベース・タイプは使用できません。
SQL問合せ内のすべてのSELECT
リスト列に別名を指定する必要があります。
詳細は、17.1.3項「データ型マッピング」を参照してください。
注意: Oracle Event Processing JDBCデータ・カートリッジを使用するには、データ・ソースでOracle JDBCドライバのバージョン11.2以上が使用される必要があります。 詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』の異なるデータベース・ドライバまたはドライバ・バージョンへのアクセスの構成に関する項を参照してください。 |
この項では、Oracle Event Processing JDBCデータ・カートリッジのデータ型マッピングについて説明します。
参考のために、例17-1に示すOracle Event Processing JDBCデータ・カートリッジ・コンテキスト関数があるとします。
例17-1 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> ...
詳細は、17.1.2項「有効範囲」を参照してください。
Oracle Event Processing JDBCデータ・カートリッジを使用するには、次の手順で説明するように、アプリケーションの開発中に、1つ以上のアプリケーションの有効範囲内にあるJDBCカートリッジ・コンテキストを宣言または構成する必要があります。
EPNファイル内でのJDBCカートリッジ・コンテキストの宣言手順:
例17-2に示すように、必須のネームスペースおよびスキーマの場所のエントリを追加するように、Oracle Event ProcessingアプリケーションEPNアセンブリ・ファイルを編集します。
例17-3に示すように、EPNファイル内でエントリをjdbc-context
タグ付きで追加し、id
属性を指定します。id
は、このアプリケーションの有効範囲内にあるコンテキストの名前を示し、このコンテキストで定義されている関数を参照するCQL問合せで使用されます。id
は、このコンテキストがアプリケーション構成ファイルで構成される際にも使用されます。
例17-2 EPNアセンブリ・ファイル: Oracle Event Processing 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 Event Processing 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 Event Processing JDBCデータ・カートリッジに伝播されます。例17-4では、Oracle CQL問合せによって、Oracle Event Processing 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 Event Processing開発者ガイドfor Eclipse』のOracle Event Processing JDBCデータ・カートリッジのアプリケーション・コンテキストの構成方法に関する項を参照してください。
一般に、Oracle Event Processing JDBCデータ・カートリッジは次のように使用します。
Oracle Event Processing JDBCカートリッジ・アプリケーションの有効範囲内にあるコンテキストを宣言および定義します。
詳細は、17.1.4項「Oracle Event Processing JDBCデータ・カートリッジのアプリケーション・コンテキスト」を参照してください。
コンポーネント構成ファイル内のjc:jdbc-ctx
要素で、1つ以上のSQL文を定義します。
詳細は、17.2.1,項「SQL文の定義: function要素」を参照してください。
function
要素のreturn-component-type
子要素をJava beanとして指定する場合は、そのbeanを実装し、クラスがOracle Event Processingアプリケーション・クラスパス上に存在するようにします。
例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 Event Processingでエラーが発生します。たとえば、例17-4に示す関数内のSELECT項目が、どのように例17-5のフィールド名と一致するか確認します。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle Event Processing IDE for Eclipseのプロジェクトに関する項
Oracle CQL TABLE
句を使用してjc:jdbc-ctx
要素で定義されるSQL文を呼び出し、SQLSELECT
リストの別名で返される結果にアクセスする、1つ以上のOracle CQL問合せを定義します。
詳細は、17.2.2項「Oracle Event Processing JDBCデータ・カートリッジによるOracle CQL問合せの定義」を参照してください。
例17-6に示すように、コンポーネント構成ファイルのjc:jdbc-cxt
要素内で、function
子要素を使用してJDBCカートリッジ・コンテキスト関数を定義できます。
例17-6 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> ...
指定するjc:jdbc-cxt
要素内で1つ以上のfunction
要素を定義できます。
この項の内容は、次のとおりです。
各function
要素では、表17-1にリストされている属性がサポートされます。
表17-1 function要素の属性
属性 | 説明 |
---|---|
|
JDBCカートリッジ・コンテキスト関数の名前。 名前とシグネチャの組合せは、指定するOracle Event Processing 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 Event Processing JDBCデータ・カートリッジ・コンテキスト関数で使用可能なSQL型と、それぞれに対応するOracle Event Processing Java型およびcom.bea.wlevs.ede.api.Type
型のリストです。
表17-3 SQL列型とそれに対応するOracle Event Processing型
SQLタイプ | Oracle Event Processing Java型 | com.bea.wlevs.ede.api.Type |
---|---|---|
|
|
bigdecimal |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意: Java型のサイズがSQL型のサイズを超える場合、Oracle Event Processingアプリケーションで、SQL型の最大サイズの値を制限する必要があります。CQL側で使用されるタイプの選択は、データベース列内の値の範囲で決定されるようにします。たとえば、SQL列が、整数の範囲の値が含まれている数値である場合、CQL側で"int"タイプを使用します。誤った型を選択し、値が範囲外となった場合、Oracle Event Processingで数値オーバーフローのエラーが発生します。 |
注意: Oracle Event Processing JDBCデータ・カートリッジでは、Oracle Spatialデータ型はサポートされません。 |
詳細は、17.2.1.3項「function要素の使用方法」を参照してください。
この項では、次のように、Oracle Event Processing JDBCデータ・カートリッジを使用して定義可能な別のJDBCカートリッジ・コンテキスト関数の例を示します。
Oracle Event Processing JDBCデータ・カートリッジを使用して、複数の入力パラメータを使用するJDBCカートリッジ・コンテキスト関数を定義できます。
例17-7に、2つの入力パラメータを使用するJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Event Processing 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 Event Processing JDBCデータ・カートリッジを使用して、データベースが定義するPL/SQL関数を呼び出すJDBCカートリッジ・コンテキスト関数を定義できます。
例17-8に、PL/SQL関数getOrderAmt
を呼び出すJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Event Processing 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 Event Processing JDBCデータ・カートリッジを使用して、副問合せ、集計、GROUP BY
、ORDER BY
およびHAVING
など、任意の複雑なJDBCカートリッジ・コンテキスト関数を定義できます。
例17-9に、複雑なJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Event Processing JDBCデータ・カートリッジ・アプリケーション・コンテキストを示します。
例17-9 Oracle Event Processing 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 Event Processing JDBCデータ・カートリッジを使用すれば、各関数が一意のシグネチャを持つ場合、同じアプリケーション・コンテキスト内に同じ名前のJDBCカートリッジ・コンテキスト関数を定義できます。
例17-10に、getDetails
という名前の2つのJDBCカートリッジ・コンテキスト関数を定義するOracle Event Processing 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 Event Processing JDBCデータ・カートリッジを使用してSQL文を呼び出すOracle CQL問合せの定義方法について説明します。
詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のOracle CQLによるイベント・ストリームの問合せに関する項を参照してください。
例17-11に示すようなOracle Event Processing JDBCデータ・カートリッジ・コンテキスト関数があるとします。
例17-11 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
リストの別名で、結果セット内の列にアクセスします。
詳細は、17.2.2.2項「TABLE句の使用」を参照してください。
例17-12に示すようなOracle Event Processing JDBCデータ・カートリッジのSQL文があるとします。
例17-12 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> ...
例17-13のOracle CQL問合せにより、例17-12で定義されるJDBCカートリッジ・コンテキスト関数が呼び出されます。
例17-13 Oracle Event Processing 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 Event Processing JDBCデータ・カートリッジ・コンテキスト関数の呼出しは、Oracle CQL問合せのTABLE
句にラップする必要があります。
次を使用して結果セットにアクセスします。
TABLE_CLAUSE_ALIAS
.JDBC_CARTRIDGE_FUNCTION_ALIAS
.SQL_SELECT_LIST_ALIAS
orTABLE_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と一致する必要があります。