Oracle® Fusion Middleware Oracle CQLデータ・カートリッジによるアプリケーションの開発 12c リリース(12.2.1.2.0) E82779-01 |
|
前へ |
次へ |
Oracle Stream Analytics JDBCデータ・カートリッジを使用すると、データベースに対してSQL問合せを実行し、戻り値をCQL問合せで使用できます。
カートリッジの機能を使用する場合、SQL問合せをJDBCカートリッジ関数の定義と関連付けます。その後、CQL問合せから、関連付けられているSQL問合せをデータベースに対して実行するJDBCカートリッジ関数の呼出しが可能になります。この関数呼出しは、その関数呼出しを行うCQL問合せ内のCQLリレーションとしてSQL問合せの結果を使用できるようにするため、TABLE句内に含める必要があります。
注意:
Oracle CQL文からリレーショナル・データベース表にアクセスするにはOracle JDBCデータ・カートリッジを使用することをお薦めします。
TABLE句の詳細は、「TABLE句の使用」を参照してください。
この章の内容は次のとおりです。
Oracle Stream Analyticsストリームはストリーミング・データを持ち、データベースは通常は履歴データを保存します。履歴データ(1つ以上の表に保存されている)をOracle Stream Analyticsストリームのストリーミング・データに関連付けるには、Oracle Stream Analytics JDBCデータ・カートリッジを使用します。Oracle Stream Analytics JDBCデータ・カートリッジは、データベースに対して任意のSQL問合せを実行し、その結果をCQL問合せで使用します。この項では、Oracle Stream Analytics JDBCデータ・カートリッジを使用してストリーミング・データと履歴データを関連付ける方法を説明します。
この項では、次の内容について説明します。
Oracle Stream Analytics JDBCデータ・カートリッジでは、カートリッジID com.oracle.cep.cartridge.jdbc
が使用されます。このIDは予約されるので、他のカートリッジによって使用されません。
詳細は、「Oracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト」を参照してください。
Oracle Stream Analytics JDBCデータ・カートリッジは、次の制限のもと、任意の複合SQL文をサポートします。
SQL問合せのSELECT
リストでは、ネイティブSQL型のみを使用できます。
SELECT
リストではユーザー定義型および複合型を使用できません。
SQL問合せの各SELECT
リスト列でエイリアス名を使用できます。エイリアス名を使用する場合は、selectリストが戻り型のプロパティ名に一致するようにします。
注意:
Oracle Stream Analytics JDBCデータ・カートリッジを使用するには、データ・ソースでOracle JDBCドライバのバージョン11.2以上を使用する必要があります。
JDBC関数のパラメータを指定するにはparam
要素を使用します。パラメータはname
のvalue
のペアで指定します。name
属性は指定されたtype
のイベント・データを指定します。type
属性はOracle CQLデータ型になります。Oracle CQLのデータ型については、『Oracle CQL言語リファレンス』を参照してください。
次の例は、param
とtype
ペアを使用して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> ...
Oracle Stream Analytics JDBCデータ・カートリッジを使用するには、アプリケーション開発時に、次の手順に従って1つ以上のアプリケーションの有効範囲内にあるJDBCカートリッジ・コンテキストを宣言および構成する必要があります。
EPNファイル内でのJDBCカートリッジ・コンテキストの宣言手順:
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 Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキストをEPNアセンブリ・ファイルに作成する方法を示しています。
<jdbc:jdbc-context id="JdbcCartridgeOne"/>
一般に、Oracle Event Processing JDBCデータ・カートリッジは次のように使用します。
コンポーネント構成ファイルの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
要素を定義できます。
この項では、次の内容について説明します。
各function
要素は表3-1にリストされた属性をサポートしています。
表3-1 function要素の属性
属性 | 説明 |
---|---|
|
JDBCカートリッジ・コンテキスト関数の名前。 名前とシグネチャの組合せは、特定のOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト内で一意である必要があります。詳細は、「JDBCカートリッジ・コンテキスト関数のオーバーロード」を参照してください。 |
各function
要素では、次の子要素がサポートされます。
param
子要素では、オプションの入力パラメータが指定されます。
SQL文では、ゼロ以上のパラメータを使用できます。各パラメータはparam
要素内で定義されます。
param
子要素は表3-2に示す属性をサポートしています。
表3-2 param要素の属性
属性 | 説明 |
---|---|
|
入力パラメータの名前。 有効なパラメータ名は、A-Z、a-z、0-9および_(アンダースコア)の組合せで構成されます。 |
|
パラメータのデータ型。 |
データ型サポート - 入力パラメータparam
要素のtype
属性には、Oracle CQLネイティブのcom.bea.wlevs.ede.api.Type
データ型のみを指定できます。
注意:
データ型の名前では大/小文字が区別されます。com.bea.wlevs.ede.api.Type
クラスで指定される文字を使用します。
詳細は表3-3を参照してください。
return-component-type
子要素では、関数の戻り値が指定されます。この子要素は必須です。
JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプを表します。この関数は常にOracle CQL TABLE
句内から呼び出され、常にコレクション型を返します。
詳細は、「TABLE句の使用方法」を参照してください。
データ型サポート - 次のいずれかの型をreturn-component-type
要素の値として指定できます。
Oracle CQLネイティブのcom.bea.wlevs.ede.api.Type
データ型。
Java beanなどの、Oracle CQL拡張可能Javaカートリッジ型。
詳細は、次を参照してください。
sql
子要素では、SQL文が指定されます。この子要素は必須です。
各function
要素には、単一行のSQL文を1つのみ含めることができます。SQL文自体は<![CDATA[>
ブロック内に定義します。
SQL文では、param
要素のname
属性でコロン(:
)接頭辞を使用して入力パラメータを指定します。
注意:
JDBCカートリッジ・コンテキスト関数内のすべてのSELECT
リスト列に別名を指定する必要があります。
データ型サポート – 表3-3は、Oracle Stream Analytics JDBCデータ・カートリッジ・コンテキスト関数で使用できるSQL型および対応するOracle Stream AnalyticsのJava型およびcom.bea.wlevs.ede.api.Type
型を示しています。
表3-3 SQL列型とそれに対応するOracle Stream Analyticsの型
SQL型 | Oracle Stream AnalyticsのJava型 | com.bea.wlevs.ede.api.Type |
---|---|---|
|
|
bigdecimal |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意:
Java型のサイズがSQL型のサイズを超える場合、Oracle Stream AnalyticsアプリケーションでSQL型の最大サイズの値を制限する必要があります。CQL側で使用されるタイプの選択は、データベース列内の値の範囲で決定されるようにします。たとえば、SQL列が、整数の範囲の値が含まれている数値である場合、CQL側で"int"タイプを使用します。誤ったタイプを選択し、値が範囲外となった場合、Oracle Stream Analyticsで数値オーバーフローのエラーが発生します。
注意:
Oracle Stream Analytics JDBCデータ・カートリッジでは、Oracle Spatialデータ型はサポートされません。
詳細は、「function要素の使用方法」を参照してください。
この項では、Oracle Stream Analytics JDBCデータ・カートリッジを使用して定義できる各種JDBCカートリッジ・コンテキスト関数の例を説明します。次の内容が含まれます。
Oracle Stream Analytics JDBCデータ・カートリッジを使用して、複数の入力パラメータを使用するJDBCカートリッジ・コンテキスト関数を定義できます。
次の例は、2つの入力パラメータを使用するJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Stream Analytics 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 Stream Analytics JDBCデータ・カートリッジを使用して、データベースが定義するPL/SQL関数を呼び出すJDBCカートリッジ・コンテキスト関数を定義できます。
次の例は、PL/SQL関数getOrderAmt
を呼び出すJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Stream Analytics 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 Stream Analytics JDBCデータ・カートリッジを使用して、副問合せ、集計、GROUP BY
、ORDER BY
およびHAVING
など、任意の複雑なJDBCカートリッジ・コンテキスト関数を定義できます。
次の例は、複雑なJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Stream Analytics 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 Stream Analytics JDBCデータ・カートリッジを使用すると、各関数が一意のシグネチャを持つ場合に、同じアプリケーション・コンテキストで同じ名前のJDBCカートリッジ・コンテキスト関数を定義できます。
次の例は、getDetails
という名前の2つのJDBCカートリッジ・コンテキスト関数を定義するOracle Stream Analytics 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>
この項では、Oracle Stream Analytics JDBCデータ・カートリッジを使用して、SQL文を起動するOracle CQL問合せを定義する方法を説明します。次の内容が含まれます。
Oracle Stream Analytics 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句の使用方法」を参照してください。
Oracle Stream Analytics 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 Stream Analytics 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
別名。
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」を参照してください。
次は、ネイティブ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に一致する必要があります。