ユーザーズ ガイド

     前  次    目次     
ここから内容

XQuery の実装

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 Data Service Integrator でサポートされる拡張関数

Oracle Service Bus は、以下の関数を除き、Oracle Data Service Integrator が提供するすべての拡張関数をサポートしています。

以下の関数は使用しないでください。他の言語機能で代用することをお勧めします。

Oracle Data Service Integrator のすべての拡張関数のリストと各関数の説明については、『XQuery 開発者ガイド』の「XQuery の実装」を参照してください。

 


Oracle Service Bus での拡張関数

Oracle Service Bus には、以下の XQuery 関数が用意されています。

fn-bea:lookupBasicCredentials

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

戻り値は、以下の形式の XML 要素です。

<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() は、汎用一意識別子を返します。関数には以下の署名が含まれます。

fn-bea:uuid() as xs:string

この関数をプロキシ パイプラインで使用して、ユニークな識別子を生成できます。生成されたユニークな識別子を、要素として XML ドキュメントに挿入できます。システム変数にユニークな識別子は生成できません。これを、メッセージ ペイロードの変更に使用できます。

たとえば、トラッキング用にユニークな識別子を生成してメッセージに追加するとします。この関数を使用してユニークな識別子を生成できます。関数が返す文字列を SOAP ヘッダに追加できます。

fn-bea:execute-sql()

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() 関数の使用方法について説明します。

例 1 : 動的ルーティングのデータベースからの URI の取得

Oracle Service Bus プロキシ サービスでは、実行時のメッセージのルーティング (動的) 先である URI の仕様をサポートしています。詳細については、「動的ルーティングの使用」を参照してください。コード リスト 9-1 は、動的ルーティング シナリオでデータベースから URI を取得する fn-bea:execute-sql() 関数の使用例を示しています。

コード リスト 9-1 データベースからのビジネス サービスの URI の取得
<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 で、

コード リスト 9-2 に示すように、DISPATCH_MAPPING テーブルが設定されます。

コード リスト 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) は使用しません。

例 3 の fn-bea:execute-sql の実行

プロキシ サービスがコード リスト 9-3 の要求メッセージ (要求メッセージの <customer_pri> の値は 0001) を受信した結果として、コード リスト 9-1 の XQuery が実行された場合、動的ルーティング シナリオで返される URI は次のようになります。

system/UCGetURI4DynamicRouting_proxy1

(コード リスト 9-2 も参照してください。)

コード リスト 9-3 要求メッセージの $body の例
<m:Request xmlns:m="http://www.bea.com/alsb/example"> 
<m:customer_pri>0001</m:customer_pri>
</m:Request>

例 2 : データベースからの XMLType データの取得

サポート対象のデータベースについて XQuery エンジンが生成する、またはサポートするデータ型マッピングの詳細については、「XQuery-SQL マッピング参照」を参照してください。SQL の XMLType カラム タイプはサポートされていません。ただし、XMLType オブジェクトの getStringVal() メソッドを使用して XMLType カラムのデータにアクセスし、文字列値に変換できます。

以下のシナリオでは、Oracle データベースの XMLType カラムからデータを選択する際に使用できる手順について説明します。

  1. プロキシ サービスのメッセージ フローで割り当てアクションを使用して、次の XQuery の結果を変数 ($result) に割り当てます。
  2. コード リスト 9-4 データベースからの XMLType データの取得
    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
      );
  3. 次の置換アクションを使用して、$body のノードのコンテンツを (前の手順で $result に割り当てた) fn-bea:execute-sql() クエリの結果に置き換えます。
  4. Replace [ node contents ] of [ undefined XPath ] in [ body ] with 
    [ $result/purchase_order/text() ]

    以下のサンプル コードは、置換後の $body を示します。

注意 : datatypes テーブルには、(発注書データを含む) 行 が 1 つ含まれています。この行には、コード リスト 9-5 に示す XML が含まれています。
コード リスト 9-5 XML コンテンツを fn-bea:execute-sql() の結果に置き換えた後の $body
<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>

fn-bea:serialize()

XML ドキュメントを XML 要素としてではなく文字列として表す必要がある場合は、fn-bea:serialize() 関数を使用します。たとえば、EJB インタフェースを介して XML ドキュメントを交換する場合、EJB メソッドは引数を文字列として受け取ります。関数には以下の署名が含まれます。

fn-bea:serialize($input as item()) as xs:string


  ページの先頭       前  次