![]() ![]() ![]() ![]() |
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
![]() ![]() ![]() |