|
Oracle Service Bus XQuery エンジンは、1 つの例外モジュールを除き、XQuery の World Wide Web (W3C) の仕様に記載されているすべての言語機能を完全にサポートしています。XQuery 1.0 および XPath 2.0 の関数と演算子の詳細 (2004 年 7 月 23 日に公開された W3C の作業草案) については、次の URL を参照してください。
http://www.w3.org/TR/2004/WD-xpath-functions-20040723/
Oracle Service Bus では、以下の XQuery 関数をサポートしています。
| 注意 : | すべての Oracle の拡張関数で、次の関数プレフィックス fn-bea: を使用します。つまり、XQuery の完全な表記では拡張関数は次の形式になります。fn-bea: function_name |
Oracle Service Bus は、以下の関数を除き、Oracle Data Service Integrator が提供するすべての拡張関数をサポートしています。
以下の関数は使用しないでください。他の言語機能で代用することをお勧めします。
Oracle Data Service Integrator のすべての拡張関数のリストと各関数の説明については、『XQuery 開発者ガイド』の「XQuery の実装」を参照してください。
Oracle Service Bus には、以下の XQuery 関数が用意されています。
fn-bea:lookupBasicCredentials 関数は、指定されたサービス アカウントのユーザ名と暗号化されていないパスワードを返します。任意のタイプのサービス アカウントを指定できます (静的、パススルー、またはユーザマッピング)。詳細については、『Oracle Service Bus Console の使い方』の「サービス アカウント」を参照してください。
fn-bea:lookupBasicCredentials 関数は、カスタム転送ヘッダ、または SOAP エンベロープのアプリケーション固有の場所にあるユーザ名とパスワードのエンコードに使用する XQuery 関数の大規模なセットの一部として使用します。HTTP 認証ヘッダにユーザ名とパスワードだけを含める必要がある場合、または WS-Security ユーザ名トークンとしてユーザ名とパスワードだけを必要とする場合は、この関数を使用する必要はありません。Oracle Service Bus は事前にサービス アカウントからユーザ名とパスワードを取得し、必要に応じて HTTP 認証ヘッダにエンコードします (WS-Security ユーザ名トークンの場合も同様)。
fn-bea:lookupBasicCredentials( $service-account as xs:string ) as UsernamePasswordCredential
ここで、$service-account は、以下の形式のサービス アカウントのパスと名前です。
project-name[/folder[...]]/service-account-name
<UsernamePasswordCredential
xmlns="http://www.bea.com/wli/sb/services/security/config">
<username>name</username>
<password>unencrypted-password</password>
</UsernamePasswordCredential>
返された要素をユーザ定義の変数に保管し、必要なときにこの変数からユーザ名とパスワード値を取得できます。
たとえば、Oracle Service Bus プロジェクトには、myProject という名前が付けられます。myServiceAccount という名前の静的なサービス アカウントを、myFolder1/myFolder2 という名前のフォルダに作成します。サービス アカウントに、ユーザ名 pat とパスワード patspassword を保存します。
サービス アカウントのユーザ名とパスワードを取得するには、以下の関数を呼び出します。
fn-bea:lookupBasicCredentials( myProject/myFolder1/myFolder2/myServiceAccount )
<UsernamePasswordCredential
xmlns="http://www.bea.com/wli/sb/services/security/config">
<username>pat</username>
<password>patspassword</password>
</UsernamePasswordCredential>
関数 fn-bea:uuid() は、汎用一意識別子を返します。関数には以下の署名が含まれます。
fn-bea:uuid() as xs:string
この関数をプロキシ パイプラインで使用して、ユニークな識別子を生成できます。生成されたユニークな識別子を、要素として XML ドキュメントに挿入できます。システム変数にユニークな識別子は生成できません。これを、メッセージ ペイロードの変更に使用できます。
たとえば、トラッキング用にユニークな識別子を生成してメッセージに追加するとします。この関数を使用してユニークな識別子を生成できます。関数が返す文字列を SOAP ヘッダに追加できます。
fn-bea:execute-sql() 関数を使用すると、Oracle Service Bus のメッセージ フローで XQuery から低レベルのデータベースにアクセスできます。詳細については、「XQuery を使用したデータベースへのアクセス」を参照してください。クエリは、型付きデータを含むフラットな行要素のシーケンスを返します。
fn-bea:execute-sql( $datasource as xs:string, $rowElemName as xs:QName, $sql as xs:string, $param1, ..., $paramk) as element()*
戻り値は、型付きデータを含むフラットな行要素のシーケンスで、SQL/JDBC データ モデルと XQuery データ モデル間で値を自動的に変換します。サポート対象のデータベースについて XQuery エンジンが生成する、またはサポートするデータ型マッピングの詳細については、「XQuery-SQL マッピング参照」を参照してください。
Oracle Service Bus メッセージ フローから fn-bea:execute-sql() 関数を実行する場合、返された要素をユーザ定義の変数に格納できます。
以下の例では、Oracle Service Bus での fn-bea:execute sql() 関数の使用方法について説明します。
Oracle Service Bus プロキシ サービスでは、実行時のメッセージのルーティング (動的) 先である URI の仕様をサポートしています。詳細については、「動的ルーティングの使用」を参照してください。コード リスト 9-1 は、動的ルーティング シナリオでデータベースから URI を取得する fn-bea:execute-sql() 関数の使用例を示しています。
<ctx:route><ctx:service>
{fn-bea:execute-sql(
'ds.myJDBCDataSource',
xs:QName('customer'), 'SELECT targetService FROM DISPATCH_MAPPING WHERE customer_priority=?',
xs:string($body/m:Request/m:customer_pri/text()))/TARGETSERVICE/text()
}
</ctx:service></ctx:route>
コード リスト 9-1 で、
ds.myJDBCDataSource はデータ ソースの JNDI 名。xs:string($body/m:Request/m:customer_pri/text()) は、要求メッセージを確認し、メッセージに customer_pri の値を含む customer_priority=? を生成する。/TARGETSERVICE/text() は SQL ステートメントの結果に適用されるパス。返される要素の文字列 (CDATA) コンテンツを生成する。<ctx:route><ctx:service> ... </ctx:service></ctx:route> は、動的ルーティング シナリオの XQuery ステートメントに必須の要素。DISPATCH_MAPPING のテーブル定義を以下に示す。create table DISPATCH_MAPPING ( customer_priority varchar2(256), targetService varchar2(256), soapPayload varchar2(1024));
コード リスト 9-2 に示すように、DISPATCH_MAPPING テーブルが設定されます。
INSERT INTO DISPATCH_MAPPING (customer_priority, targetService, soapPayload) VALUES ('0001', 'system/UCGetURI4DynamicRouting_proxy1', '<something/>'); INSERT INTO DISPATCH_MAPPING (customer_priority, targetService, soapPayload) VALUES ('0002', 'system/UCGetURI4DynamicRouting_proxy2', '<something/>');| 注意 : | このシナリオでは、テーブルの 3 行目 (soapPayload) は使用しません。 |
プロキシ サービスがコード リスト 9-3 の要求メッセージ (要求メッセージの <customer_pri> の値は 0001) を受信した結果として、コード リスト 9-1 の XQuery が実行された場合、動的ルーティング シナリオで返される URI は次のようになります。
system/UCGetURI4DynamicRouting_proxy1
(コード リスト 9-2 も参照してください。)
<m:Request xmlns:m="http://www.bea.com/alsb/example"> <m:customer_pri>0001</m:customer_pri></m:Request>
サポート対象のデータベースについて XQuery エンジンが生成する、またはサポートするデータ型マッピングの詳細については、「XQuery-SQL マッピング参照」を参照してください。SQL の XMLType カラム タイプはサポートされていません。ただし、XMLType オブジェクトの getStringVal() メソッドを使用して XMLType カラムのデータにアクセスし、文字列値に変換できます。
以下のシナリオでは、Oracle データベースの XMLType カラムからデータを選択する際に使用できる手順について説明します。
$result) に割り当てます。fn-bea:execute-sql(
'ds.myJDBCDataSource',
'Rec',
'SELECT a.purchase_order.getStringVal() purchase_order from datatypes a'
)
ds.myJDBCDataSource はデータ ソースの JNDI 名。Rec は $rowElemName。したがって、Rec は結果の要素シーケンスの各要素に指定された QName です。 select a.purchase_order.getStringVal() ... は、文字列値に変換するために、XMLType オブジェクトの getStringVal() メソッドを使用する SQL ステートメント。datatypes は、XML の値の読み込み元であるテーブル (この場合、datatypes テーブルには 1 つの行が含まれている)。| 注意 : | dataty.pes テーブルのテーブル定義を以下に示す。 |
create table datatypes (purchase_order xmltype
);$body のノードのコンテンツを (前の手順で $result に割り当てた) fn-bea:execute-sql() クエリの結果に置き換えます。 Replace [ node contents ] of [ undefined XPath ] in [ body ] with
[ $result/purchase_order/text() ]
| 注意 : | datatypes テーブルには、(発注書データを含む) 行 が 1 つ含まれています。この行には、コード リスト 9-5 に示す XML が含まれています。 |
<soap-env:Body>
<openuri:orders xmlns:openuri="http://openuri.com/">
<openuri:order>
<openuri:customerID>123</openuri:customerID>
<openuri:orderID>123A</openuri:orderID>
</openuri:order>
<openuri:order>
<openuri:customerID>345</openuri:customerID>
<openuri:orderID>345B</openuri:orderID>
</openuri:order>
<openuri:order>
<openuri:customerID>789</openuri:customerID>
<openuri:orderID>789C</openuri:orderID>
</openuri:order>
</openuri:orders>
</soap-env:Body>
XML ドキュメントを XML 要素としてではなく文字列として表す必要がある場合は、fn-bea:serialize() 関数を使用します。たとえば、EJB インタフェースを介して XML ドキュメントを交換する場合、EJB メソッドは引数を文字列として受け取ります。関数には以下の署名が含まれます。
fn-bea:serialize($input as item()) as xs:string
|