ヘッダーをスキップ
Oracle Containers for J2EEサービス・ガイド
10g(10.1.3.5.0)
B56027-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

8 Oracle XML Query Service

この章では、Oracle XML Query Service(XQS)の使用方法について説明します。XQSサービスはエンタープライズ・データの取得、分析、統合および変換に役立つユーザー・モデルを提供します。この章には、次の項目が含まれます。

Oracle XML Query Serviceの概要

この項では、XQSおよびXQSの基盤となる関連テクノロジの概略を提供し、Oracle XML Query Serviceについて説明します。内容は次のとおりです。

XQSの概要

XQSとは、OC4Jサービスの1つで、XQuery(XML問合せ言語)で作成されており、エンタープライズ・データの統合ビューを作成するための簡単な宣言方式を提供します。

通常、XQSなどのサービスがなければ、XQueryはXML文書にしかアクセスできません。XQSを使用することで、SOAPやJDBCなどのアクセス・メカニズムを介して、XML以外のドキュメント、リレーショナル・データベース、およびXML以外のその他のエンタープライズ情報システムからもデータを取得できます。

XQSを使用すると、プログラミング作業が簡略化されます。計画の段階では、XQuery式の設計(問合せ、組込みファンクション・コールまたはユーザー定義ファンクション・コール)およびデータ構造のみに集中して作業できます。データソースへのアクセスの詳細は、構成設定によって後で決定されます。XQuery式とアクセスするデータ間のバインドは、この構成設定で発生します。その後、XQSによって、XQS関数と呼ばれる外部XQuery関数が作成されます。この関数は、目的のソースからデータを取得するために使用します。

XQSは、非定型問合せ(実行時に渡されるXQuery式)またはXQSビュー(以前作成して保存した問合せ)をサポートします。ビューはXQuery関数になり、後で名前でアクセスできます。(XQuery自体は、ビューの概念をサポートしていません。)ビューを使用することで、XQuery式を再利用し、強力で保守しやすい階層問合せを作成できます。

XQSは、多様なクライアント・インタフェースを提供します。そのため、EJB、JSPタグ・ライブラリ、JavaクラスまたはWebサービスを介してXQuery式を実行できます。

XQS関連のテクノロジ

この項では、XQSの基盤となるテクノロジの概要を説明します。


注意:

これらのテクノロジおよび関連テクノロジの入門チュートリアルは、次のサイトで探すことができます(サイトにはその他のチュートリアルも多数含まれています)。
http://www.w3schools.com/

XQueryの概略

XQueryは、XMLデータの問合せと変換に使用できる宣言型言語です。目的の条件を使用してXMLソースをインテリジェントに問い合せ、要素と属性、およびそれらに含まれるデータを取得し、解析できます。これは、XMLデータベースやXML文書などの多種多様なXMLソースで幅広く適用される、柔軟性の高い標準テクノロジです。XQueryは、SQLと類似した機能を持ち、リレーショナル・データベースの問合せにおけるSQLのような役割を果します。

XQueryでは、データの問合せだけでなく、XMLデータの変換も行えます。そのため、XSLTの補足機能または代替として使用できます。

XPath 2.0に基づく式のデータ・モデルでは、XQueryの基本的な構成メンバーはです。それぞれのXQueryの結果は、XML順序として戻されます。XML順序は、0(ゼロ)個以上の連続したデータ項目の列で、各項目はスカラー値、XMLノードまたはXML文書です。項目のタイプの定義は、XML Schema標準に基づきます。

各問合せは、1つ以上の、モジュールと呼ばれる部分で構成され、各モジュールは、1つのプロローグおよびそれに続く1つの問合せボディで構成されます。プロローグは、モジュールの処理環境を定義する一連の宣言およびインポートです。

XQueryに含まれる問合せの一般的なモデルは、for-let-where-order-return(FLWOR)式です。次の疑似コードは、FLWOR式で可能な処理の例を示しています。

For each department in depts.xml
Let [variable] represent each employee in each department
Where the headcount of employees in a department is at least 10
Order by average salary of department
Return headcount and average salary of each department

XQueryでは、定義および事前定義済関数を使用して問合せを実行することもできます。複雑な問合せの場合は、外部関数を別途提供し、XQuery定義から宣言および起動できます。外部関数は、JavaやSQLなどの様々な言語で実装できます。

外部関数の使用は、XQS機能の重要な部分です。独自のデータに対して目的の問合せが実行できるように、XQS構成に従って外部関数が作成されます。


注意:

  • XQuery 1.0はXPath 2.0の拡張機能です。そのため、同じデータ・モデル、関数および構文を共有します。データ・モデルは、XSLT 2.0にも共通しています。

  • XQueryの詳細は、次のWebサイトにある「XQuery 1.0: An XML Query Language」の仕様を参照してください。

    http://www.w3.org/TR/xquery/
    

Oracle XQueryの実装

JavaでのOracle XQueryの実装は、XQSの基礎となるエンジンであり、Oracle XML Query Serviceの一部として提供されます。このOracle XQuery実装は、Oracleデータベース製品のOracle XML DBの一部であるOracle XQuery実装と起点や機能が共通していますが、この2つを混同しないようにしてください。

XML項目タイプ

OracleのXQuery実装では、タイプoracle.xml.xqxp.datamodel.XMLItemを使用して、問合せ結果のXML順序に含まれる個々の項目が表されます。

事前定義済の名前空間および接頭辞

次の表に、XQueryおよびXQSで使用できる、事前定義済の名前空間および接頭辞を示します。

表8-1 事前定義済のネームスペースおよび接頭辞

接頭辞 名前空間 説明

ora

http://xmlns.oracle.com/xdb

Oracle XML DBの名前空間

ユーザーが選択した任意の接頭辞

urn:oracle.bpel.xq

Oracle BPEL環境におけるXQSビューのデフォルトの名前空間

local

http://www.w3.org/2003/11/xpath-local-functions

XPathローカル関数宣言の名前空間

fn

http://www.w3.org/2003/11/xpath-functions

XPath関数の名前空間

xdt

http://www.w3.org/2003/11/xpath-datatypes

XPathデータ型の名前空間

xml

http://www.w3.org/XML/1998/namespace

XMLの名前空間

xs

http://www.w3.org/2001/XMLSchema

XML Schemaの名前空間

xsi

http://www.w3.org/2001/XMLSchema-instance

XML Schemaインスタンスの名前空間


これらの接頭辞は、XQuery式のプロローグで宣言せずにXQuery式で使用できます。また、xml以外は、すべてプロローグ内で再定義できます。oraおよびurn以外のすべての接頭辞は、XQuery標準で事前定義済です。

Oracle XQueryの拡張関数

JavaバージョンのOracle XQueryには、このデータベース・バージョンで最初に導入されたora拡張関数のサポートが含まれています。サポート対象は次のとおりです。

  • ora:containsを使用すると、フルテキスト述語を伴う構成検索を制限できます。

  • ora:matchesを使用すると、正規表現を使用して文字列内のテキストを一致させることができます。

  • ora:replaceを使用すると、正規表現を使用して文字列内のテキストを置換できます。

  • ora:sqrtを使用すると、数値の平方根を戻すことができます。

  • ora:viewを使用すると、XML文書のように、XQuery式に含まれる既存のデータベース表またはデータベース・ビューを問い合せることができます。実際には、この関数によって、リレーショナル・データに関連するXMLビューが作成されます。

これらの関数の詳細は、『Oracle XML DB開発者ガイド』を参照してください。


注意:

今回のリリースの時点では、まだ、W3C XQueryワーキング・グループによってXQueryの勧告が公開されていませんでした。オラクル社は、XQuery標準が勧告になるまで、その進化を継続して追跡します。その間、オラクル社では、XQuery標準の進化に対応するために、以前のリリースまたはパッチ・セットとの下位互換性がないXQuery実装の更新をリリースすることを余儀なくされる可能性があります。オラクル社は、XQuery勧告が公開されるまでの間、XQuery実装にかかわるデータベース・リリース間またはパッチ・セット間のすべての下位互換性を保証しません。XQuery標準が勧告になった後、オラクル社は、XQuery勧告の実装を組み込んだリリースまたはパッチ・セットを作成します。それ以後は、下位互換性にかかわるオラクル社の標準ポリシーがOracle XQuery実装に適用されます。XQueryのステータスに関する最新の情報は、http://www.w3.orgを参照してください。

XQuery標準で指定された実装の選択肢

暗黙的タイムゾーンのサポート: XQSのXQueryでは、暗黙的タイムゾーンは常にZとみなされます。

実装のXQuery標準からの逸脱

+0と-0の境界条件の相違: XQuery標準では正のゼロと負のゼロが区別されますが、XQSのXQueryでは区別されません。両方とも0と表示され、同様に処理されます。

XQueryのオプション機能

W3Cによって定義されているXQueryのオプション機能を次に示します。ただし、これらの機能は現時点ではサポートされていません。

  • スキーマ・インポート機能

  • スキーマ検証機能

  • モジュール機能

これらの定義済のオプション機能に加えて、W3C仕様では、実装によって、実装定義のプラグマおよび拡張機能が提供されます。提供されるものは次のとおりです。

  • プラグマ

  • Must-understand拡張機能

  • Static-typing拡張機能

Oracle実装では、このようなプラグマや拡張機能は要求されません。

XQueryの関数および演算子のサポート

XQSでは、最新の仕様に含まれるほとんどのXQuery関数とXQuery演算子がサポートされていますが、次のものはサポートされていません。

  • XQuery regular-expression関数。

    正規表現(regular-expression)の操作には、かわりにOracle拡張機能を使用してください。

  • 関数fn: tracefn:idfn:idreffn:codepoint-equalfn:prefix-from-QNamefn:doc-availableおよびfn:collection()(引数を取らないfn:collection()

XQuery関数docおよびcollection

XQuery組込み関数fn:docおよびfn:collectionは、本質的に実装定義済です。XQSでは、これらの関数はサポートされています。関数docは、URI引数によって対象に指定されたローカル・ファイル・システムからファイルを取得します。ファイルは、整形式のXMLデータである必要があります。関数collectionも同様ですが、ファイルではなくフォルダを取得します(フォルダ内の各ファイルは整形式のXMLデータである必要があります)。

fn:docおよびfn:collectionのXQS実装では、次に示すファンクション・コールのように、引数はプロトコルがfileで、ローカル・ファイル・システムにあるファイルへのパスを指定するURLである必要があります。

   fn:doc("C:/MyDocuments/XQS/myView.xq")

URLのプロトコル部分は省略できます。プロトコルは、デフォルトではfileです。

fn:doc()関数のかわりに、XQSドキュメント関数を使用し、Oracle Application Serverがサポートする任意のURLを介してドキュメントにアクセスできます。たとえば、HTTPプロトコルを使用してXMLドキュメントにアクセスするには、次の構成で<document-source>を定義します。

   <document-source>
         <function-name prefix="ns"> genericFile </function-name>
   </document-source>

次に示すように、XQS関数genericFile()は問合せ式の一部にすることも可能です。

declare namespace ns = "…";
declare function ns:genericFile() external;
for $i in ns:genericFile("http://www.acme.com/repository/item137560.xml") return ...

XQSとXQuery API for Javaの比較

XQuery API for Java(XQJ)は、JavaアプリケーションからXQuery式を実行するための、進化中の標準です。(JSR-225を参照してください。)また、JDBCに相当する低水準プログラム・インタフェースです。ただし、XQJはまだ標準ではないため、Oracle Application Serverではサポートされていません。

XQSでは、同様の基礎機能のための高水準APIが提供されます。データソースに接続するためのコードを記述せずにJavaからXQuery式を実行したり、XQuery式のオブジェクトを作成するなどの処理が可能です。

XQS使用の利点

XQSは様々な用途に使用できます。WebサービスおよびJavaアプリケーションだけでなく、XMLデータやXML以外のデータへのアクセスにも役立ちます。

また、XQSを使用すると、低水準のXQJインタフェースを使用してXQuery式を実行するなどの、コーディング手順を行う必要がありません。プログラム的でない構成を介したデータソース・アクセスのXQSモデルにより、より迅速に、より便利に開発が行えます。さらに、XQSによって作成される外部関数のライブラリの登録は自動的に処理され、名前空間の割当ては自由に制御できます。

データを取得するだけでなく、XQSは、XMLデータを変換したり、複数のソースからのデータを結合するための便利なメカニズムとしての機能を果します。

これ以外にも、XQSには次の利点と利便性があります。

  • XQS構成モデルでは、アクセスする特定のデータソースまたはXML文書とは関係なく問合せを作成できるため、アプリケーションをより移植しやすくなります。必要な手順は、XQS構成のソースの場所またはドキュメントの場所を変更するだけです。

  • XQSビュー機能を使用すると、階層問合せをより簡単に行うことができ、問合せの共有、再利用および集中管理が可能になります。

  • その他のOracle Application ServerコンポーネントやOracle Databaseコンポーネントと連携してパフォーマンスの最適化が行われるため、XQSを介して実行した問合せでは、少なくともハンドコードされたXQJと同等、通常はそれ以上のパフォーマンスが得られます。XQS自体でも、追加のパフォーマンス拡張が提供されます。これにより、ソースデータおよび結果の構成可能なキャッシングを使用でき、ラージ・データセットを効率的に処理できます。

  • XQSによって、中間層とデータベース層間の移行が単純化されます。データソースが中間層の容量を超えた場合、通常は、中間層アプリケーションを変更または再デプロイせずに、Oracle XDBにデータを移行できます。データベースにデータを移動し、必要に応じて、そのデータソースの構成を更新します。中間層のそれ以外のデータソースは、中間層に残ります。

「XQSのパフォーマンス機能および最適化機能の概要」も参照してください。

要件、制限事項および特記事項

XQS実装には、次の要件、制限事項および特記事項があります。

  • XQSでは、OC4J Java Object Cacheを使用してキャッシングが行われます。そのため、キャッシュが実行中で(必要であれば自動的に起動させる)、Java Object Cacheの構成ファイルが存在することが要求されます。キャッシングに関する追加情報は、「XQSキャッシングの構成」を参照してください。

  • 主に現在のXQuery仕様の制限により、XQSでは、データソースからの読取りはできますが、データソースへの書込みはできません。データの問合せはできますが、データの更新、挿入または削除は行えません。

  • ファンクション・コールによって戻された(XMLデータ・モデルで定義されている)一連のノード内では、各ノードに一意のIDが指定されています。ただし、1つの問合せで同じ関数が2回以上コールされた場合、異なる結果セット間でのノードIDの一意性は、XQSによって保証されません。そのため、ノードIDに基づく問合せの中には、結果が非決定的になるものもあります。たとえば、次のような問合せ(Q1およびQ2)があるとします。

    (: Q1 :)
    declare namespace xqs="http://xmlns.oracle.com/ias/xqs";
    declare function xqs:a() external;
    let $x := xqs:a()
    return $x/b is $x/b
    

    ノードIDテストの対象が、同じファンクション・コールから取得されたノードであれば、Q1では、常にtrueが戻されます。

    (: Q2 :)
    declare namespace xqs="http://xmlns.oracle.com/ias/xqs";
    declare function xqs:a() external;
    xqs:a()/b is xqs:a()/b
    

    Q2では、パフォーマンスの最適化の設定によって、trueまたはfalseが戻されます。

XQSの機能の概要

この項では、XQSの重要な機能の概要を説明します。詳細は、この章で後述しています。

XQSデータソースのサポート

前述のように、XQSでは、数種類のデータソースがサポートされています。この項には、次の関連項目が含まれます。

データソースのサポート対象カテゴリ

XQSでは、多様なアクセス・プロトコルが要求されるデータソースは、WSDLドキュメントを介して記述されます。これは、XQSのサポートにより、一般に普及しているApache Web Services Invocation Framework(WSIF)(SOAPやHTTPの背後にあるWebサービス・メカニズムの拡張機能)で、すべてのカスタム起動プロトコルが組み込まれるためです。このメカニズムにより、XQSは、SOAPベースのWebサービスではなく、WSDLベースのソースをサポートします。XQSでは、SQLで記述されたXQSビューのメカニズムを使用し、JDBCを介してリレーショナル・データベースにアクセスすることもできます。

XQSによってサポートされるすべてのデータソースのカテゴリは、次のとおりです。これらのデータソースには、SQLベースのビューまたはWSDLドキュメントを介して多様なソースにアクセスするための特別な機能があります。

  • ドキュメント: ファイル、つまりXML文書を含むURLベースの入力ストリームにアクセスします。これは、組込みXQuery関数fn:doc()の機能に似ています。XQSでは、XML以外のファイルもサポートしているため、XML以外のデータをXMLに変換するOracle Data Definition Description Language(D3L)トランスレータ・プラグインをサポートしています。

  • XQSビュー: 前に格納された問合せを実行します(データベースのストアド・プロシージャと概念が類似しています)。XQSにより、問合せの検出、外部変数のバインドおよび問合せの実行が行われます。

  • SQLベースのXQSビュー: リレーショナル・データベースの表、ビュー、PL/SQLストアド・プロシージャまたはJavaストアド・プロシージャにアクセスします。これは、SQLベースのXQSビューの実行時に、JDBCを介してデータベースに接続することで実行します。Oracle XMLデータベースを使用している場合は、SQLベースのXQSビューを使用して、データベースから直接XML型の値を選択できます。詳細は、「データベース・ソースを使用するための準備(SQLベースのXQSビュー)」を参照してください。

  • SOAPバインディングを伴うWSDLソース: Webサービスを介してリソースにアクセスします。Webサービス操作およびデータソースを記述するために、SOAPバインディングを伴うWSDLドキュメントを指定する必要があります。

  • JavaまたはEJBのバインディングを伴うWSDLソース: XMLデータを戻すカスタムJavaクラスまたはEJBを介して、リソースにアクセスします。その手段として、Java用WSIFプロバイダまたはEJB用WSIFプロバイダが使用されます。JavaクラスまたはEJBを実装し、Javaクラス名またはEJB名、および引数の型を指定して、JavaまたはEJBのバインディングを伴うWSDLドキュメントを指定する必要があります。

WSDLソース用に指定したWSDLドキュメントでは、適切なバインディングを使用して、一連のコール可能な操作が記述され、ソースへの接続に関する詳細が提供されます。XQS構成では、各操作の名前を参照し、WSDLをポイントして操作の説明を参照します。WSDLには作業URLが必要です。作業URLは、XQS構成で指定します。XQSでは、WSDLをフェッチする際にこのURLに移動します。また、XQSでは、WSDL URLをXQuery名前空間として使用することや、WSDLポートの個々の操作をその名前空間のローカル名として処理することが可能です。

XQuery関数を介したデータソース・アクセス

データソースへのアクセスと操作の実行には、前述の、XQS関数と呼ばれる外部XQuery関数が使用されます。XQSは、XQS構成に基づいて、自動的に作成および起動されます。構成内で、関数の名前と名前空間、およびその他の関連項目(入力パラメータなど)を指定します。問合せでデータソースを使用する際には、XQueryプロローグで、関連するXQS関数を外部関数として宣言する必要があります。

名前空間は、関数オブジェクトを含む1つの関数ライブラリに対応します。各関数オブジェクトは、1つの操作に対応します。たとえば、SOAPバインディングを伴うWSDLソースの場合、WSDLドキュメント内の各操作に対して1つの関数オブジェクトがあります。XQSビュー・ソースでは、各関数オブジェクトは個々のストアド・クエリーに対応しています。

データソース関数オブジェクトの役割

XQSによって作成されたそれぞれの関数オブジェクトは、XQS構成に従ってインスタンス化され、次の基本タスクを実行します。

  1. XQueryエンジンから渡された入力引数を受け入れます。許容される入力タイプは、XML順序で許容されるものに準じます。すなわち、Javaプリミティブ型およびXMLノードです。XQSでは、JavaオブジェクトとXMLのマッピングを実行できませんが、Oracle TopLinkを使用するなどして、問合せの前にマッピングを実行できます。

  2. 基礎となるデータソースに対して問合せを起動します。XQSにより、関数名が対応するXQS構成要素にマップされ、データソースの接続情報が検出されて、接続が作成されます。

  3. 結果を受け取り、パッケージ化します。XQSは、同期的にデータソースからXML書式で結果を受け取り、受け取った結果をXML順序にパッケージ化します。

  4. エラー(データソース・アクセスの問題や型の不一致など)を処理し、エラー処理の構成に従ってエラー情報を戻します。

データソースの準備の概要

XQSで使用できるほとんどのデータソースには、必要な準備手順があります。例:

  • XML以外のドキュメント・ソースを使用するには、XQSで提供される変換ツールOracle D3Lを使用するための準備が必要です。準備には、データ書式の指示を含むD3Lスキーマ・ファイルを指定することが含まれます。

  • XQSビューを使用するには、データの入力型と戻り型を考慮し、問合せを設計して.xqファイルとして保存し、その配置場所を決定する必要があります。

  • サポートされているいずれかのバインディングを伴うWSDLソースを使用するには、適切なWSDLドキュメントを指定(場合によっては作成)する必要があります。

詳細は、「データソースを使用するための準備」を参照してください。

XQSの構成および構成ファイルの概要

XQS構成ファイルはxqs-config.xmlです。XQSは、アプリケーションEARファイルのトップレベルにあるxqs-resources.jarファイル(OC4Jパッケージ化ユーティリティで作成)で、この構成ファイルを検索します。この構成ファイルを使用して、XQS関数およびデータソースの情報を指定します。

xqs-config.xmlのトップレベルの要素は次のとおりです。

  • <document-source>を使用すると、XMLファイルまたはXML以外のファイルを含むドキュメントのデータにアクセスできます。

  • <xqsview-source>を使用すると、XQSビューを使用できます。

  • <wsdl-source>は、ユーザーが指定したWSDLドキュメントに関連するデータソースに使用できます。

XQSは、構成ファイルから情報を読み取り、その情報を使用して、データソースにアクセスするXQS関数オブジェクトを移入します。

構成の更新時には、OC4Jの再起動は不要ですが、アプリケーションを再デプロイする必要があります。(詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。)

追加情報は、「XQS関数の構成方法」を参照してください。


注意:

Oracle Application Serverでは、Oracle Enterprise Manager 10g Application Server Controlコンソールに、XQS構成のページはまだ含まれていません。XQS構成は、xqs-config.xmlファイルで直接管理できます。

XQSクライアント・インタフェースの概要

XQSでは、XQuery機能の実装に使用できる、次のクライアント・インタフェースがサポートされています。各インタフェースの使用方法および例は、「アプリケーション・コードの開発方法: XQSクライアント・インタフェースを使用した場合」を参照してください。


注意:

問合せにいずれかのXQSクライアントAPIを使用する場合、問合せの実行によって結果が定義されますが、すべての結果がただちにメモリーに格納されるとはかぎりません。メモリーにただちに、および完全に格納される一連の結果は、「マテリアライズされている」(実体がある)と表現されます。これに対して、暗黙カーソルを介し、次の項目を処理するための(next item)機能を使用して1回(バッチの場合は複数回)にアクセスされる一連の結果は、「マテリアライズされていない」(実体がない)と表現されます。マテリアライズされていない結果は、いつ取得されてメモリーに書き込まれるのかが保証されません。次の項目を処理する(next item)コールによって、次の結果項目を作成するXQuery式の評価がトリガーされます。

後続の説明のように、XQSクライアントAPIでは、マテリアライズされた結果に対してステートレス・クライアント・オブジェクトを使用するか、マテリアライズされていない結果に対してステートフル・クライアント・オブジェクトを使用するかを選択できます。

これらの概念の詳細および重要な考慮事項は、「ステートフル・クライアントとステートレス・クライアント」を参照してください。


  • クライアントAPI: XQSでは、汎用JavaインタフェースXQSFacadeIが提供されます。このJavaインタフェースは、目的のXQuery機能のJava実装に使用できます。このインタフェースは、ファサードというデザイン・パターンに基づいており、表面上は、基礎となるXQS機能の詳細や複雑さが見えないようになっています。適切な実行(execute)メソッドを使用して、非定型問合せまたはXQSビュー名、およびバインド・パラメータを渡します。どちらの場合も、次の項目を取得する(get next item)メソッドを使用して、結果を処理します。問合せの実行後、XQSFacadeIインスタンスによりXMLの結果順序がラップされ、現在の状態が維持されます。順序の項目を段階的に取得して処理するか(ステートフル・アプローチ)、順序の全項目を一度に取得して処理し、その後基礎となるデータソース・リソースを解放するか(ステートレス・アプローチ)は、クライアントによって決まります。


    注意:

    XQSFacadeIインタフェースも、EJBクライアントAPIおよびJSPタグ・ライブラリでは背後で使用されます。

  • Oracle BPEL XQuery関数: Oracle BPEL PM環境では、XQueriyを実行するOracle BPEL XPath関数を使用して、XQueryおよびXQSを使用できます。Oracle BPEL PMには、BPELユーザー(com.collaxa.cube.xml.xpath.functions.xml. GetElementFromXQueryFunction)用のJavaクラスが用意されています。このクラスはBPELプロセス付きのXPath関数として登録し、実行用にBPELプロセスとともにパッケージ化したXQueryのいずれかの名前を渡すことができます。

  • EJBクライアントAPI: EJBクライアントAPIは、リモート(RMI経由)またはローカルで、セッションBeanを介してアプリケーションにアクセスする方法を提供します。XQSでは、ステートフル・セッションBeanとステートレス・セッションBeanのどちらかの使用がサポートされます。ステートレス・セッションBeanを使用すると、EJBへのコールが最小限に抑えられます。一方、ステートフル・セッションBeanを使用すると、メモリー使用量が少なくて済みます。どちらの場合も、適切な実行(execute)メソッドで、非定型問合せまたはXQSビュー名、およびバインド・パラメータを指定します。ステートフル・セッションBeanの場合は、次の項目を取得する(get next item)メソッドを使用して結果を処理します。ステートレス・セッションBeanでは、順序は常にマテリアライズされ、実行(execute)メソッドによって戻されます。

  • JSPタグ・ライブラリ: JSPタグ・ライブラリでは、HTTPを介してアプリケーションにアクセスする方法が提供されます。XQSでは、ステートフル・アクセスとステートレス・アクセスのどちらかのJSPタグが提供されます。executeタグまたはexecuteCursorタグを使用して、非定型問合せまたはXQSビュー名を指定します。どちらのタグを使用するかは、ステートフル・アクセスとステートレス・アクセスのどちらを使用するかによります。バインド・パラメータを指定するには、ネストされたparameterタグを使用します。ステートフル・アクセスの場合は、executeCursorタグと関連付けられたnextタグを使用して、結果を処理します。ステートレス・アクセスでは、順序は常にマテリアライズされ、executeタグによって戻されます。結果は、executeタグまたはexecuteCursorタグの属性設定に基づいて、JSP出力ストリーム、DOMドキュメントまたはJava Objectインスタンスの配列として戻されます。

  • XQSビューWebサービス: XQSビューの使用時には、オプションで、ビューをWebサービス操作として公開するために、XQSで作成される操作をWSDLドキュメントに追加できます。(これは、XQSビューの構成の一部として処理されます。)その後、その他のWebサービスと同様に、このWebサービスのクライアントを実装できます。


注意:

XQS QueryParameterIインタフェースにも注意する必要があります。JavaクライアントAPIまたはEJBクライアントAPIの外部バインドを伴う問合せを使用するには、そのバインド値のQueryParameterIオブジェクトの配列を作成する必要があります。「XQS QueryParameterIリファレンス」を参照してください。(このインタフェースも、JSPクライアント・インタフェースでは背後で使用されます。)

OC4JPackagerの概要

XQSで提供されるOC4JPackagerは、XQS関連のファイルをJ2EEアプリケーションまたはWebアプリケーションでパッケージ化し、そのアプリケーションでXQS機能を使用できるようにするコマンドラインJavaツールです。

通常は、XQSクライアントAPI(XQSFacadeIインタフェース、EJBクライアントAPIまたはJSPタグ・ライブラリ)の1つを介してXQSをコールするWebアプリケーションを書き込みます。また、関連するデータソースおよびXQSビューをポイントするXQS構成ファイルxqs-config.xmlを作成し、ビューが配置されているディレクトリであるXQSリポジトリを選択します。その後、アプリケーション、XQS構成ファイルおよびXQSリポジトリをEARファイルにバンドルします。このファイルは後でデプロイします。

コマンドライン・パラメータを介してOC4JPackagerに命令が出されると、すべてのバンドルの手順が自動的に完了します。具体的には、次の処理が行われます。

  1. xqs-config.xmlおよびすべてのXQSリポジトリ・ファイルを、xqs-resources.jarというファイルにバンドルします。

  2. アプリケーションに関連付けられている各アーカイブ(WARファイルやEJB JARファイルなど)を開き、マニフェスト(MANIFEST.MF)内のClass-Path属性を変更して、xqs-resources.jarを含めます。

  3. すべてのアプリケーション・アーカイブ・ファイルおよびxqs-resources.jarで構成されるEARアーカイブをバンドルします。

  4. EARアーカイブ内のorion-application.xmlファイルを(必要に応じて)作成または変更し、EARのすべてのコンポーネントがアクセスできるライブラリのリストにxqs-resources.jarを追加します。

OC4JPackagerを実行する際には、次のいずれかを含むディレクトリを指定します。

  • 既存のEARファイル。OC4JPackagerによってバンドルが解除され、再作成されます。

  • WARファイルやEJB JARファイルなどの既存のJ2EEモジュール・セット。OC4JPackagerによって新規EARにバンドルされます。

Webサービス操作として公開するXQSビューに対し、OC4JPackagerにより、Webサービス操作の起動がXQSビューに委譲され、追加のタスクが実行されます。操作は、自動的に生成されるWSDLドキュメントに追加されます。詳細は、「XQSビューをWebサービス操作として公開するためのOC4JPackagerの追加の出力」を参照してください。

一般的なOC4JPackagerの詳細は、「OC4JPackagerを使用したXQSアプリケーションのパッケージ方法」および「OC4JPackagerのリファレンス」を参照してください。

XQSアプリケーションのセキュリティ

XQS自体では、セキュリティ層はまったく追加されません。この点で、XQSは本質的にJ2EEアプリケーションと似ています。セキュリティは、使用するXQSクライアントおよびアクセスするデータソースのタイプに応じて、必須のWebおよびJ2EEの標準セキュリティ機能を介して、OC4Jによって提供されます。

たとえば、SQLバインディングを伴うSQLベースのXQSビューを使用する場合は、データソース・セキュリティ機能を使用します。XQS EJBクライアント・インタフェースを使用する場合は、標準のEJBセキュリティを使用します。XQS JSPタグ・ライブラリを使用する場合は、標準のHTTP接続認証を使用します。その他を使用する場合も、それぞれのセキュリティ機能を使用します。

XQSのパフォーマンス機能および最適化機能の概要

XQSでは、パフォーマンスを向上させる次の機能が提供されます。

  • キャッシング: XQSでは、将来の問合せで使用できるように、XQSビューの実行結果、またはデータソースのXMLデータをキャッシュできます。これにより、特に、データソース(外部Webサービスなど)へのアクセスに時間がかかる状況で、パフォーマンスが向上します。キャッシングは、非同期ソースへのアクセス時にも重要です。XQS構成を介して、キャッシュ・データの有効期限および無効化の設定を指定するか、オプションでキャッシング全体を無効にできます。

  • ラージ・データセットの処理: XQSには、数十MB以上もあるようなラージ・データセットへのアクセス時に、システム・メモリーが不足する危険性を最小限に抑える機能があります。このような状況になると、XQSでは、データの必要性に応じて結果が部分的にマテリアライズされ、メモリー使用量が一定の範囲内にとどめられます(作業単位方式)。オプションで、データ項目を1つずつ戻すこともできます。

  • スケーラビリティ: XQSでは、入力が効率的にXQueryエンジンに配信され、キャッシュ・リソース(解析済WSDLドキュメントなど)を共有および再利用できます。また、スケーラビリティに応じて、マテリアライズされていない結果順序を使用できます。これらの動作は、XQS構成を介して制御できます。

詳細は、「XQSパフォーマンス機能の使用方法」を参照してください。


注意:

XQSでは、Oracle XQueryエンジンおよびXDKと密接に連携してデータ・フローが最適化されますが、問合せの最適化は行われません。

XQSエラー処理の概要

XQSアプリケーションの実行時には、入力パラメータをデータソースで要求されるタイプに変換する際や、データソースによって戻されたデータをXMLに変換する際などに、XQS外部関数および基礎となるデータソースに関連する問題が発生する場合があります。また、データソースが使用できない場合や、エラーが戻されることもあります。XQSのデフォルトの動作では、このような状況でXQuery動的エラーが発生します。それによって問合せの実行が停止し、結果が戻されなくなります。

XQS構成属性(onError)を使用して、より影響の少ない動作を選択すると、XQSを続行して、発生したエラーに関する追加情報を取得できます。使用できるエラー処理モードは次のとおりです。

  • dynamicError(デフォルト)

  • emptySequence

  • errorMessage

emptySequenceモードまたはerrorMessageモードを使用した場合、そのモードの設定対象となったXQS外部関数の実行時にエラーが発生しても、問合せの実行は停止せず、必要に応じて後で取得できるようにXQSによって保存されます。XQSにより、空のXML順序(emptySequenceモードの場合)または1つのエラー・メッセージで構成される単一項目のXML順序(errorMessageモードの場合)が戻されます。errorMessageモードでは、XQS構成で固定エラー・メッセージを事前に構成しておくか、データソースから戻されたエラー・メッセージをそのまま使用することができます。

XQS外部関数の抑止されたエラーの情報は、XQSによって、XQSErrorIオブジェクトのイテレータ内に戻されます。

XQSでは、XQS関数内部のエラーにのみ、特別な処理が適用されます。構文エラーやタイプの不一致などの通常のXQueryエラーの場合は、いずれのXQSエラー・モードでも、問合せの実行が停止します。

XQSエラー・モードは、XQS関数ごとに個別に構成します。1つの関数のエラー・モードが、同じ問合せ内の他のXQS関数の動作に影響することはありません。

詳細は、「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

XQSの主な使用手順の要約

XQSを使用する場合の主な手順を次に示します。各手順の詳細を記述した項へのリンクも提供しています。

  1. 必要に応じてデータソースを準備します。たとえば、ドキュメント・ソースの場合は、XML以外をXMLに変換するための設定などを行います。XQSビューの場合は、問合せの定義や保存などを行います。データベースなどのソースへのアクセスにも、特別な設定が必要になる場合があります。「データソースを使用するための準備」を参照してください。

  2. XQSを構成します。xqs-config.xmlファイルを使用して、アクセスするデータソースおよび実行する問合せの指定と構成を行い、問合せのデータソースを表すXQS関数へのマッピングを作成します。「XQS関数の構成方法」を参照してください。

  3. 問合せを設計します。「問合せの設計方法」を参照してください。

  4. アプリケーションを開発します。開発では主に、XQSによって提供されるいずれかのAPIを使用して、XQuery式を実行し、戻されたXML結果を処理することが要求されます。「アプリケーション・コードの開発方法: XQSクライアント・インタフェースを使用した場合」を参照してください。

  5. アプリケーションをパッケージ化し、デプロイします。XQSに付属のパッケージャを使用します。「OC4JPackagerを使用したXQSアプリケーションのパッケージ方法」を参照してください。


注意:

ここに示した手順は単純化されたものです。通常、特にXQSビューが含まれている複数のソースでは、これらの手順をモジュール的に順番に行って完了させることはできません。実際には、処理の繰り返しが必要になります。たとえば、このようになります。最初にデータベース・ソースの準備を行い、次にそのソースの問合せを設計します。その後、問合せをXQSビューとして保持します。つまり、XQSビュー・ソースを準備します。さらに、そのビューを使用する別の問合せを設計します。

データソースを使用するための準備

XQSで使用するほとんどのデータソースには、必要な準備手順があります。この項には、次の項目が含まれます。

XML以外のドキュメント・ソースを使用するための準備

ドキュメントの中には、ネイティブのメッセージ書式としてXMLを使用せず、バイトおよび文字の構造化された記録などのネイティブ書式を使用するものがあります。この例として、Excelのカンマ区切り(CSV)ファイルがあります。XQSおよびXQueryでXML以外のデータが理解されるには、XQSで適切な変換ツールを使用できることが必要です。そのためには、事前定義済の、構造化された一連の規則にデータが従っている必要があります。このような構造化された書式のデータは処理が可能なため、取得されてからXML書式に変換され、アプリケーションで使用できるようになります。

XML以外のドキュメントを使用できるように、XQS実装では、Oracle Data Definition Description Language(D3L)をサポートしています。XQSでXML以外のドキュメントを使用するための準備として、次の手順を行います。

  1. XML以外のデータに、D3L変換メカニズムとの互換性があることを確認します。

  2. D3Lによってデータが解析および変換されるように、D3Lにデータ書式の指示を出すスキーマ・ファイルを指定します。

  3. スキーマ・ファイルの名前および場所を指定して、D3Lを使用できるようにXQSを構成します。

次の各項では、D3Lおよびその使用方法の概要を示します。


注意:

D3Lの機能の詳細は、『Oracle Application Server Integration InterConnectユーザーズ・ガイド』を参照してください。

D3Lとは

D3Lには、ネイティブの、XML書式以外のドキュメントが従う必要がある構造が記述されます。これにより、特定のOracleの中間層コンポーネント(OracleAS Integration InterConnectが一般的ですが、ここではXQS)で処理されるようになります。

D3Lによって提供されるものは、次のとおりです。

  • バイナリ・データ、文字列データ、構造化データおよび配列データのレコード・レイアウトなど、ネイティブ・ファイルの書式を示す、XMLベースのデータ記述言語

  • D3Lスキーマ・ファイルからの指示を使用してネイティブ書式のファイルの内容を変換する、変換エンジン

D3Lスキーマ・ファイルは、D3L Document Type Definition(DTD)によって定義された構文に準拠している必要があります。XQS構成を介して、使用するD3Lスキーマ・ファイルを指定します。


重要:

D3Lを使用するには、基礎となるネイティブ書式データ内のフィールド数が固定され、認識されていることが必要です。D3Lは、任意の構造を持つデータ(標準のXMLなど)、名前/値ペアのデータ、または解析にトークンの先読みを必要とする条件付きデータ構造には適しません。

D3Lスキーマ・ファイル

D3Lスキーマ・ファイルには、D3L変換エンジンがデータを解析してXMLに変換するために必要な、データ型、書式およびデリミタが記述されています。このスキーマ・ファイルは、d3l.dtdの仕様に準拠する必要があります。

D3Lスキーマ・ファイルの詳細および作成方法は、『Oracle Application Server Integration InterConnectユーザーズ・ガイド』を参照してください。ここでは、このファイルの概要がわかるように、ファイルの一部分を示します。

<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE message SYSTEM "d3l.dtd">
<message name="replyFlight" type="BookingReplyType" object="Booking"
         header="D3L-Header" value="replyOptions">
   <unsigned4 id="u4" />
   <unsigned2 id="u2" />
   <struct id="DateTimeRecord">
      <field name="DateInfo">
         <date format="MMDDYY">
            <pfxstring id="datstr" length="u4" />
         </date>
      </field>
      <field name="TimeHour"><limstring delimiter="*" /></field>
      <field name="TimeMinute"><limstring delimiter="*" /></field>
   </struct>
...
</message>

D3Lを使用するためのXQSの構成

XML以外のドキュメント・ソースに対し、XQSでD3Lの変換メカニズムを使用するには、次の手順を行います。

  1. <document-source><XMLTranslate>サブ要素を使用して、D3Lを使用するようにXQSに対して指定します。(後で、その他のツールもサポートして、同様に指定することができます。)

  2. <XMLTranslate><schema-file>サブ要素を使用して、データ解析に使用するD3Lのスキーマ・ファイルを指定します。

次に、PersonalInfoD3L.xmlという名前のD3Lスキーマ・ファイルを使用するためのXQS構成を示します。

<document-source ... >
   ...
   <XMLTranslate method="D3L">
      <schema-file>http://host:port/xqs/PersonalInfoD3L.xml</schema-file>
   </XMLTranslate>
   ...
</document-source>

注意:


XQSビューを使用するための準備

前述のように、XQSビューとは、将来使用できるように格納された問合せです。XQSでは、ビュー自体がソースとして扱われるため、ビューの構成は、<xqsview-source>要素を介して行います。問合せをXQSビューとして使用するための準備手順は、次のとおりです。

  1. 問合せで要求される入力パラメータを考慮します。XQSビューのパラメータは、XQueryのプロローグでそのパラメータを外部変数として宣言することで指定できます。

  2. 問合せを設計します。これには、入力パラメータに対して外部変数を宣言することも含まれます。設計した問合せを.xqファイルとして保存します。(「問合せの設計方法」も参照してください。)

  3. .xqファイルの保存場所を考慮します。.xqファイルの保存場所は、XQSリポジトリと呼ばれます。この場所は、XQS構成を介して(<repository>要素を使用して)指定できるほか、OC4JPackagerの実行時に-repositoryオプションを介して指定した場所を使用することもできます。

  4. Webサービス操作としてXQSビューを公開するかどうかを考慮します。この処理は、XQS構成ファイルにある<xqsview-source>要素のWSDLvisibility属性を介して行います。これにより、1つの操作としてWebサービスにビューが含められ、XQSによってアプリケーションに追加されます。Webサービス操作としてビューを公開する場合は、XMLの出力タイプに注意してください。この出力タイプを、構成に含まれる<xqsview-source><output-element>サブ要素に反映することをお薦めします。(追加情報として、「Webサービス操作として公開されたXQSビューの使用方法」も参照してください。)

次に示すのは、XQSビューに使用するXQuery式です。この式では、外部変数locが受け入れられ、ファイルから注文(purchase order)データを読み取る関数readFileに渡されます。.xqファイルの保存時には目的の名前を付け、XQS構成でその名前を指定できます。ビューを実行するためにXQSが実装するXQS関数にも、目的の名前を指定する必要があります。ファイル名と関数名は別個のものですが、必要に応じて、デフォルトで関数名をファイルのベース名として使用できます。

declare variable $loc external;
declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:readFile($l as xs:string) external;
for $po in xqs:readFile($loc)//po return $po//total

通常、XQS構成の<xqsview-source>要素の中では、少なくとも次のものを使用します。

  • Webサービス操作としてビューを公開する予定の場合はWSDLvisibility属性、また、実際にビューを公開する場合は<output-element>サブ要素

  • ビューのXQS関数に目的の名前を指定するための<function-name>サブ要素

  • XQS関数の入力パラメータに対応する外部変数(前の例ではloc)を指定するための、<input-parameters>サブ要素およびそのサブ要素

  • ビューが含まれている.xqファイルの名前を指定するための<queryName>サブ要素(XQS関数名と同じファイル・ベース名を使用する場合を除く)

  • .xqファイルの場所を指定するための<repository>サブ要素(OC4JPackagerの実行時に-repositoryオプションを介して指定した場所にファイルがある場合は不要)


注意:


データベース・ソースを使用するための準備(SQLベースのXQSビュー)

SQLベースのXQSビューを使用すると、リレーショナル・データベースから取得したデータに(XMLのサポートも含め)XQueryを使用できます。データはJDBC経由で取得されます。SQLベースのXQSビューは、SQL言語で記述されたストアド・クエリーです。XQSでは、SQLベースのビュー自体がソースとして扱われます。ビューは、<xqsview-source>要素を介して構成されます。

SQL問合せをXQSビューとして使用するには、次の手順を実行します。

  1. SQL問合せに使用するデータベースとスキーマを決定します。接続を表すOC4J data-sources.xml構成ファイルで、適切な<managed-data-source>または<data-source>要素を探すか定義します。そのデータソースのJNDI名を、<xqsview-source>構成要素の参照として使用します。データソースのJNDI名は、<xqsview-source>要素の<dataSource>サブ要素に明示的に指定します。XQSでは、JDBC接続の確立にデータソースを使用します。SQL問合せに基づいたXQSビューの場合、<dataSource>構成要素は必須です。

  2. 問合せに必要な入力パラメータを検討します。SQL言語で記述された問合せの場合は、問合せパラメータとして、:1:2:3などの位置指定のバインド変数を使用します。

  3. 必要なデータベース・オブジェクト(表、ビュー、ストアド・プロシージャまたはPL/SQLパッケージ)を決定します。その後、問合せを記述して、入力パラメータの位置指定のバインド変数を指定します。XQSでは、SQL問合せ文(SELECT文)のみが実行されます。問合せでは、JavaまたはPL/SQLストアド・プロシージャを起動できます。INSERTUPDATEのSQL文、またはデータ定義言語(DDL)文は使用できません。問合せを.sqlファイルとして保存します。

  4. データベース問合せで、データをリレーショナル(表)またはXML形式のいずれで戻すかを決定します。Oracle XMLデータベースを使用していて、問合せ結果がXMLType型の場合、XQSでは結果はそのまま使用され、変換は行われません。結果がすでにXML形式であることを指定するには、XMLTypeSQLResultType属性を設定します(データベースへの追加のラウンドトリップが必要で、パフォーマンスが低下するため、XQSでは問合せの独自の分析は行われません)。

    データベース問合せでデータをリレーショナル形式で戻す場合は、SQLResultType属性がrelationalに設定されている必要があります(これはデフォルトでもあります)。この場合、XQSはOracle XML-SQLユーティリティ(XSU)を使用して、リレーショナルの結果をXMLに変換します。XSUでは、結果セットのすべての行がXML要素に変換されます。デフォルトの要素名はROWです。デフォルトの要素は、<xqsview-source>構成要素のrowTag属性を設定することでカスタマイズできます。行要素は、ユーザーが選択した属性で番号付けできます。XSUでは、デフォルトでは行要素には番号は割り当てられません。行を番号付けする場合は、<xqsview-source>構成要素のrowIdAttr属性を指定します。rowIdAttr属性の値は、結果の行要素の番号付け属性の名前です。行は1から開始して、123…のように番号付けされます。

    XSUでは、リレーショナルの結果の各列を、行要素にネストする要素に変換します。要素タグは、列名から導出されます。列要素名はカスタマイズできません。ただし、SQL問合せでリレーショナルの結果を作成する場合には、列に別名を割り当てられます。

    たとえば、デフォルトのOracle Order EntryスキーマOEで実行される次のようなSQL問合せがあるとします。

    select PRODUCT_ID,PRODUCT_NAME,PRODUCT_STATUS,LIST_PRICE from
    PRODUCT_INFORMATION where product_id < :1
    

    rowTag="product"およびrowIdAttr="record_num"属性が設定されている場合、このSQLベースのビューの実行結果は次のようになります。

    <product record_num="1">
       <product_id>1726<product_id>
       <product_name>LCD Monitor 11/PM<product_name>
       <product_status>under development<product_status>
       <list_price>259<list_price>
    </product>
    <product record_num="2">
       <product_id>1729<product_id>
       <product_name>Chemicals - RCP<product_name>
       <product_status>orderable<product_status>
       <list_price>80<list_price>
    </product>
    

    SQL問合せを記述する際には、前述のXML変換も考慮してください。

  5. .sqlファイルを保存する場所を決定します。.sqlファイルの保存場所は、XQSリポジトリと呼ばれます。場所はビュー・ソースのXQS構成を介して(<repository>要素を使用して)指定します。または、OC4JPackagerユーティリティの実行時に-repositoryオプションを使用して指定します。同じリポジトリに複数の.xqおよび.sqlファイルを保存できます。

    前の例のSELECT文は、SQLベースのXQSビューで使用される式です。SQLバインド変数:1を受け入れてSQL問合せを実行し、結果を要素のXML順序の形式で戻します。.sqlファイルは任意の名前で保存し、XQS構成に指定できます。ビューを実行するXQSビュー関数の名前は、getProductInfoです。.sqlファイルの名前と関数名は別個のものですが、関数名はファイルのデフォルトのベース名と同一にできます。

次に示す要素および属性は、通常、SQLベースのXQSビュー用のXQS構成で使用されます。要素は、<xqsview-source>要素のサブ要素です。

  • <function-name>サブ要素は、ビューにXQS関数の目的の名前を指定するために使用されます。<dataSource>サブ要素は、data-sources.xml構成ファイルに定義されているデータソースのJNDI名を指定するために使用されます。データソースは、JDBC接続の確立に使用されます。このサブ要素は、SQLベースのビューには必須です。<input-parameters>サブ要素およびその<part>サブ要素は、XQS関数の入力パラメータに対応するバインド変数を指定するために使用されます。SQLバインド変数は位置によってバインドされるため、この場合、<part>サブ要素のname属性は無視されますが、位置属性は重要です(前の例で説明されているように、:1position="1"と等価です)。<xqsview-source>要素のfetchSize属性は、一度のラウンドトリップでデータベースから複数の行が転送されるよう設定するために使用されます。デフォルトは1です。この属性は、java.sql.PreparedStatementsetFetchSizeメソッドへのコールに変換されます。JDBCのsetFetchSizeパラメータは(つまり、XQSのfetchSize属性も)単なるヒントであり、バインディングではありません。<queryName>サブ要素は、SQL問合せが含まれている.sqlファイルの名前を指定するために使用されます(XQS関数名と同じベース・ファイル名を使用する場合を除く)。<repository>サブ要素は、.sqlファイルの場所を指定するために使用されます(OC4JPackagerユーティリティの使用時に-repositoryオプションを介して指定した場所にファイルがある場合は不要)。

次に示す<xqsview-source>要素の属性はオプションです。属性が設定されていない場合は、デフォルト値が使用されます。

  • fetchSize="1"

  • XMLFormat="XSU"

  • rowTag="ROW"

  • rowIdAttr=""

  • SQLResultType="relational"


注意:

XQS構成要素および属性の詳細は、「XQS構成ファイルのリファレンス」を参照してください。また、「XQSビューを使用するXQS関数の構成」も参照してください。

SOAPバインディングを伴うWSDLソースを使用するための準備

Webサービス操作を介してデータソースにアクセスするには、WebサービスのWSDLドキュメントを指定し、XQS構成でWSDLの場所を指定する必要があります。1つのXQSビュー関数は、XQSによって実装される1つのWebサービス操作に対応します。

WSDLを調査します。XQS構成ファイルに含まれる<wsdl-source>要素およびそのサブ要素を使用して、XQS関数を構成します。その際、次に示すように、WSDLエントリに対応する構成設定(一部はオプション)を使用します。

  • WSDL操作は、XQS構成の<operation>要素に対応します。

  • WSDL入力メッセージの場合、入力メッセージの各パートは、<input-parameters><part>サブ要素に対応します。

  • 適用可能なWSDLサービスは、<service>要素に対応します。

  • 適用可能なWSDLポートは、<port>要素に対応します。

  • 適用可能なWSDLポート・タイプは、<portType>要素に対応します。

また、XQSからWSDLドキュメントへのアクセス方法を考慮し、<wsdlURL>要素を使用してドキュメントの場所を指定します。


注意:


カスタム・クラスまたはEJBを使用するための準備(JavaまたはEJBのバインディングを伴うWSDLソース)

Java用またはEJB用のWSIFプロバイダを使用すると、カスタムJavaクラスまたはEJBを介してデータソースにアクセスできます。これは、Apache Foundationの公開テクノロジであるため、XQSによる特別な動作は行われません。必要な手順は次のとおりです。

  • 後で問い合せるXMLデータを戻す、カスタムJavaクラスまたはEJBを実装します。

  • 必要に応じてJavaまたはEJBのバインディングを伴うWSDLドキュメントを作成し、目的の操作を定義します。

  • 必要になるXML-Java型マッピングを考慮します。

XQS構成に関するWSDLの一般的な考慮事項は、「SOAPバインディングを伴うWSDLソースを使用するための準備」を参照してください。

クラスまたはBeanの実装方法は、『Oracle Application Server Web Services開発者ガイド』、またJava用およびEJB用のWSIFプロバイダの情報は、『Oracle Application Server Web Servicesアドバンスト開発者ガイド』を参照してください。


注意:

「WSDLソースにアクセスするXQS関数の構成」も参照してください。

Javaバインディングを伴うWSDLドキュメントの一部を例として示します。これを使用すると、操作名に基づいて、JavaメソッドreadEntry()などを起動できます。WSDLの<format:typeMapping>の仕様は、XQS構成の<typeMap>要素に対応することに注意してください。

< definitions>
  ...
  <binding name="JavaBinding" type="tns:AddressBook">
    <java:binding />
    <format:typeMapping encoding="Java" style="Java">
       <format:typeMap typeName="typens:address"
             formatType = "localjava.client.stub.addressbook.wsiftypes.Address" />
       <format:typeMap typeName="xsd:string"
             formatType="java.lang.String" />
    </format:typeMapping>
    <operation name="readEntry">
        <java:operation methodName="readEntry"
              parameterOrder = "name"
              methodType = "instance" />
        <input name="ReadEntryWholeNameRequest" />
    <operation name="readAllMatchingEntries">
     ...
    </operation>
  </binding>
  <service name="AddressBookService">
     <port name="JavaPort" binding="tns:JavaBinding">
        <java:address
          className = "localjava.service.AddressBookImpl" />
     </port>
  </service>
  ...
</definitions>

XQS関数の構成方法

すべてのXQuery式で使用されるそれぞれのXQuery外部関数、つまり、XQSによって実装されるそれぞれのXQS関数に対して、アプリケーションのXQS構成内に、問合せ、アクセスするデータソースおよび入力パラメータに使用されるXQS関数の詳細(名前など)を指定する1つのエントリが必要になります。構成には、ドキュメント・ソース、XQSビュー、WSDLソースの3つの基本カテゴリがあります。また、これらに対応する<document-source><xqsview-source><wsdl-source>という3つの高レベルの構成要素があります。

この項には、次の項目が含まれます。

XQS構成ファイルに関連する概要は、「XQSの構成および構成ファイルの概要」を参照してください。

この項で説明した構成要素のリファレンス情報は、「XQS構成ファイルのリファレンス」を参照してください。

ドキュメント・ソースにアクセスするXQS関数の構成

この項では、ドキュメント・ソースにアクセスするXQS関数の構成方法を説明し、最後に例を示します。この項に出てくる要素は、<document-source>要素のサブ要素です。追加情報は、「<document-source>」を参照してください。すべてのサブ要素の情報へのリンクも含まれています。

必須

ドキュメント・ソースに対して、少なくとも次の要素を構成する必要があります。

  • <function-name>: この要素を介して、ドキュメント・ソースへのアクセス用にXQSによって実装されるXQS関数の修飾名を指定します。この要素の値はローカル名で、名前空間の属性(「<function-name>」で説明しているようにnamespaceまたはprefix)があります。XQS関数をXQuery外部関数として宣言する際には、XQueryのプロローグでも同じ名前を使用する必要があります。

    構成の例を示します。

    <document-source ... >
       <function-name namespace="http://xmlns.oracle.com/ias/xqs">
          myFileSource
       </function-name>
       ...
    </document-source>
    

対応するXQueryの宣言と使用方法は次のとおりです。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:myFileSource() external;
for $po in xqs:myFileSource()//po
return $po

オプション(場合によっては必須)

場合により必須または適切であるドキュメント・ソースの要素は、次のとおりです。

  • <documentURL>: この要素を使用して、ドキュメント・ソースのURLを指定します。次に例を示します。

    <document-source ... >
       ...
       <documentURL>
          http://host:port/xqsdemos/Repository/pos-2KB.xml
       </documentURL>
       ...
    </document-source>
    

    重要:

    ドキュメントURLを指定する際には、次のことに注意してください。ドキュメントがローカル・ファイル・システムにある場合は、http://プロトコルを使用するよりも、file://プロトコルを使用してファイルの絶対パスを指定した方が、データの取得速度が速くなります。

    <documentURL>要素を指定すると、XQS関数が引数を取らないことを暗黙的に指定することになります。<documentURL>を省略することもできます。その場合は、次の例で示すように、実行時にURLをXQS関数に渡す必要があります。また、この関数をXQueryで宣言して、URL用のパラメータを1つ定義する必要があります。

    declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
    declare function xqs:myFileSource($bind as xs:string) external;
    for $po in xqs:myFileSource
              ("http://host:port/xqsdemos/Repository/pos-2KB.xml")//po
    return  $po
    
  • <output-element>: このサブ要素を使用すると、XML要素の修飾名または戻されたデータの出力型(単純型または複合型)を指定できます。このサブ要素は常に必須ではありませんが、この情報は、XQSによるタイプ・チェックに使用できます。次に例を示します。

    <document-source ... >
       ...
       <output-element namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
                    location="http://host:port/xqsdemos/Customers.xsd"> type=Customers
       </output-element>
       ...
    </document-source>
    

    <output-element>を定義する<xqsview-source>要素については、基になる問合せ、または別の<xqsview-source>関数を使用してネストされている問合せのerrorMessageエラー処理オプションを定義するXQS関数ごとに、<output-element>サブ要素が必要です。この要件の詳細は、「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

  • <XMLTranslate>: XML以外のドキュメント・ソースについては、この要素を使用して、使用する変換ツールを指定し、そのツールに必要なすべての情報を指定します。現在サポートされているのはD3Lのみです。D3Lを使用するには、<schema-file>サブ要素を介してD3Lスキーマ・ファイルを指定する必要があります。D3Lの詳細は、「XML以外のドキュメント・ソースを使用するための準備」を参照してください。

    次に例を示します。

    <document-source ... >
       ...
       <XMLTranslate method="D3L">
          <schema-file>
             http://host:port/xqsdemos/paymentInfoD3L.xml
          </schema-file>
       </XMLTranslate>
       ...
    </document-source>
    

パフォーマンスとエラー処理

エラー処理の設定を行い、キャッシングやラージ・データセットの特別な処理などのパフォーマンス機能の使用を指定できます。これらの設定には、<document-source>の属性isCachedlargeDataonError、およびサブ要素の<cache-properties><error-message>を使用します。これらの機能の構成は、ここでは省略します。「XQSエラー処理モードおよびAPIの使用方法」および「XQSパフォーマンス機能の使用方法」を参照してください。

それぞれの例では、キャッシング、ラージ・データおよびエラー処理のデフォルト設定が使用されています。これは、<document-source>属性がisCached="false"largeData="false"およびonError="dynamicError"と設定されていることと同じです。

固定の場所にあるXML文書のソースの例を示します。

<document-source>
   <function-name namespace="http://xmlns.oracle.com/ias/xqs">
      myFileSource
   </function-name>
   <documentURL>
      http://host:port/xqsdemos/Repository/pos-2KB.xml
   </documentURL>
</document-source>

D3L変換ツールおよびpaymentInfoD3L.xml D3Lスキーマ・ファイルを使用する、XML書式以外のドキュメント・ソースの例を示します。

<document-source>
   <function-name prefix="xqs">
      paymentStatusInfo
   </function-name>
   <documentURL>http://host:port/xqsdemos/paymentInfo.csv</documentURL>
   <XMLTranslate method="D3L">
      <schema-file>
         http://host:port/xqsdemos/paymentInfoD3L.xml
      </schema-file>
   </XMLTranslate>
</document-source>

XQSビューを使用するXQS関数の構成

この項では、XQSビューを使用するXQS関数の構成方法を説明し、最後に例を示します。この項に出てくる要素は、<xqsview-source>要素のサブ要素です。追加情報は、「<xqsview-source>」を参照してください。すべてのサブ要素の情報へのリンクも含まれています。

使用するXQSビューの作成方法などの準備手順は、「XQSビューを使用するための準備」を参照してください。

WSDLvisibilityの設定

<xqsview-source>の属性設定WSDLvisibility="true"を使用すると、XQSビューをWebサービス操作として公開できます。XQSによって生成されるWSDLに、その操作が追加されます。Webサービス操作は、そのアプリケーションのWebサービスの一部になります。WSDLvisibility属性はオプションで、デフォルト値はfalseです。


注意:

バインド変数を使用するSQLインジェクションのリスクを最低限に抑えるため、XQSではSQLベースのXQSビューをWebサービス操作として公開することはできません。SQLベースのXQSビュー機能、つまりSQL問合せに渡す前に、すべてのユーザー入力をアプリケーションでフィルタ処理および検証する必要があります。SQLベースのビューでWSDLVisibility属性がtrueに設定されている場合、XQSにより警告が発行され、その設定は無視されます。

XQSビューをWebサービスとして公開する場合の詳細情報は、「XQSビューをWebサービス操作として公開するためのOC4JPackagerの追加の出力」を参照してください。

必須

後述の説明は、次に示す例がXQSビューとしてmytotals.xqに保存されていることを前提としています。この例では、ファイルからデータを読み取る関数が使用されており、入力パラメータloc(ファイルの場所を示す文字列変数)を取得して関数に渡し、整数の合計を戻します。

declare variable $loc external;
declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:readFile($l as xs:string) as xs:int external;
for $po in xqs:readFile($loc)//po return $po//total

XQSビューを使用するには、少なくとも次の要素を構成する必要があります。

  • <function-name>: この要素を介して、ビューの実行用にXQSによって実装されるXQS関数の修飾名を指定します。この要素の値はローカル名で、名前空間の属性(「<function-name>」で説明しているようにnamespaceまたはprefix)があります。(executeView()コールで直接ビューを使用するのではなく)問合せでこの関数を使用する場合には、<function-name>要素で指定した関数名を使用して、このXQS関数をXQuery外部関数として宣言する必要があります。

    構成の例を示します。

    <xqsview-source ... >
       <function-name namespace="http://xmlns.oracle.com/ias/xqs">
          totals
       </function-name>
       ...
    </xqsview-source>
    
  • <input-parameters>: XQSビューで外部変数(SQLベースのビューの場合はバインド変数)が使用される場合は、XQSによって実装されるこの関数で、ビュー内の外部変数またはバインド変数ごとに、入力パラメータを使用する必要があります。問合せの実行前に、XQSによって、外部またはバインド変数に関数の引数の値が割り当てられます。<input-parameters>要素を使用して、入力パラメータを構成します。その際には、パラメータごとに1つの<part>サブ要素を使用します。XQSビューでは、この要素は常に必須です。入力パラメータがない場合は、空の要素を使用してください。

    <xqsview-source ... >
       ...
       <input-parameters/>
       ...
    </xqsview-source>
    

    外部文字列変数locにバインドされる1つの入力パラメータを使用した例を次に示します。XQSビューの入力パラメータには、<schema-type>または<xquery-sequence>要素を使用して、オプションでタイプ情報を指定することができます。この例は、xs接頭辞がXML Schemaの名前空間に対応するように設定されていることを前提としています。(<input-parameters><part><schema-type>および<xquery-sequence>の各要素の詳細は、この章の後半部分に含まれているリファレンス・ドキュメントを参照してください。)

    <xqsview-source ... >
       ...
       <input-parameters type-match="none" >
          <part position="1" name="loc">
             <schema-type prefix="xs">string</schema-type>
          </part>
       </input-parameters>
       ...
    </xqsview-source>
    

SQLベースのビューのバインド変数は、:1:2などの位置で示されます。同一の<input-parameters>および<part>構成要素を使用します。<part>には名前属性を指定する必要がありますが、名前の値は無視されます。SQLバインド変数は、1つ目の位置の引数は:1に、2つ目の位置の引数は:2などのように、実際の引数の位置によってそれぞれの値にバインドされます。

次の例では、問合せでのXQSビューの使用方法を示します。XQueryの宣言および使用方法は、前述の<function-name>および<input-parameters>の説明に対応しています。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:totals($loc as xs:string) as xs:int external;
for $t in xqs:totals("C:\MyPurchaseOrders.xml") return
<outstanding_balance> fn:sum($t) </outstanding_balance>

オプション(場合によっては必須)

場合により必須または適切であるXQSビューの要素は、次のとおりです。

  • <output-element>: この要素を使用すると、XML要素の修飾名または戻されたデータの出力型(単純型または複合型)を指定できます。WSDLvisibility="true"を使用するXQSビューでは、特に<output-element>要素の使用が適しており、その属性であるlocationは、要素定義またはタイプ定義を含むXMLスキーマ・ファイルをポイントする必要があります。次に例を示します。

    <xqsview-source WSDLvisibility="true">
       ...
       <output-element namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
                    location="http://host:port/xqsdemos/Customers.xsd">
       </output-element>
       ...
    </xqsview-source>
    

    WSDLvisibility="false"を使用するXQSビューでも、<output-element>要素を使用するとタイプ・チェックに役立ちます。接頭辞xsは、XML Schemaの名前空間に対応するように設定されているとします。

    <xqsview-source WSDLvisibility="false">
       ...
       <output-element prefix="xs">integer</output-element>
       ...
    </xqsview-source>
    
  • <queryName>: この要素を使用して、XQSビューを保存した.xqまたは.sqlファイルの名前を指定します。.xqまたは.sql拡張子は指定してもしなくても構いません(必要に応じて自動的に追加されます)。この<queryName>要素はオプションです。この要素を省略した場合、.xqまたは.sqlファイルのベース名は<function-name>要素で指定されたXQS関数名と同じであるとみなされます。


    注意:

    XQueryベースのXQSビュー・ファイルの拡張子は.xqである必要があります。SQLベースのビュー・ファイルの拡張子は.sqlである必要があります。<xqsview-source>構成要素に<dataSource>サブ要素が含まれている場合のみ、XQSではビューがSQLベースであるとみなされます。詳細は、「SQLベースのXQSビューに固有の考慮事項(必須)」を参照してください。

    mytotals.xqに保存されたXQSビューの例を示します。

    <xqsview-source ... >
       ...
       <queryName>mytotals</queryName>
       ...
    </xqsview-source>
    

    <function-name>要素に関する前述の例では、<queryName>を省略すると、XQSによってtotals.xqという名前のファイルが検索されます。

  • <repository>: この要素を使用して、XQSビュー・リポジトリの場所(.xqまたは.sqlファイルの場所)を指定します。この要素を省略した場合は、OC4JPackagerの-repositoryオプションを使用して指定したリポジトリとみなされます。

    例:

    <xqsview-source ... >
       ...
       <repository>META-INF/xqs/mydir</repository>
       ...
    </xqsview-source>
    
  • SQLResultType: <xqsview-source>要素のオプションの属性で、SQLベースのビューにのみ適用できます。この属性では、データベース問合せで、データをリレーショナル(表)形式またはXMLのいずれで戻すかを設定します。SQLResultTypeのデフォルト値は、relationalです。Oracle XMLデータベースを使用している場合は、SQLResultType属性をXMLTypeに設定することで、SQLベースのXQSビューを使用して(それ以上変換せずに)データベースからXML型の値を選択できます。XQSでは、リレーショナルからXMLへの変換をデータベースの結果に適用するかどうかの決定は、SQLResultType属性のみに依存します。データベースへの追加のラウンドトリップが必要で、パフォーマンスが低下するため、XQSでは問合せの独自の分析は行われません。

    データベース問合せでデータをリレーショナル形式で戻す場合は、SQLResultType属性が、明示的にまたはデフォルトでrelationalに設定されている必要があります。この場合、XQSはOracle XML-SQLユーティリティ(XSU)を使用して、リレーショナルの結果をXMLに変換します。

  • rowTagおよびrowIdAttr: <xqsview-source>要素のオプションの属性で、SQLベースのビューにのみ適用できます。これらの属性が指定されている場合、データベースの結果のリレーショナルからXMLへの変換で使用された要素および属性のデフォルト名は、これらの値でそれぞれ上書きされます。これらの属性は、SQLResultType属性がrelationalに設定されている場合にのみ適用可能です。

    XSUでは、結果セットのすべての行がXML要素に変換されます。デフォルトの要素名はROWです。デフォルトの要素は、<xqsview-source>構成要素のrowTag属性を設定することでカスタマイズできます。行要素は、ユーザーが選択した属性で番号付けできます。XSUでは、デフォルトでは行要素には番号は割り当てられません。行を番号付けする場合は、<xqsview-source>構成要素のrowIdAttr属性を指定します。rowIdAttr属性の値は、結果の行要素の番号付け属性の名前です。行は1から開始して、123…のように番号付けされます。設定rowIdAttr=""はデフォルトの動作と同じで、行の番号付け属性を抑止します。

    rowTagおよびrowIdAttr属性は、それぞれ別々に使用されます。つまり、指定できる属性は1つのみで、もう一方にはデフォルトを使用します。


    注意:

    XSUでは、リレーショナルの結果の各列を、行要素にネストする要素に変換します。要素タグは、列名から導出されます。列要素名はカスタマイズできません。ただし、SQL問合せでリレーショナルの結果を作成する場合には、列に別名を割り当てられます。

  • fetchSize: <xqsview-source>要素のオプションの属性で、SQLベースのビューにのみ適用できます。fetchSizeは、JDBCを介した1回のラウンドトリップでデータベースから取得する行数を推奨します。この属性は、java.sql.PreparedStatementsetFetchSizeメソッドへのコールに変換されます。JDBCのsetFetchSizeパラメータは(つまり、XQSのfetchSize属性も)単なるヒントであり、実装で無視される場合もあります。fetchSize属性のデフォルト値は1です。

  • XMLFormat: <xqsview-source>要素のオプションの属性で、現在使用できる値はデフォルトのXSUのみです。その他の値は今後のリリースで使用できるようになり、WebRowset形式の結果がサポートされます。現行リリースの制限は、JDK 1.5機能への依存性が原因です。

<output-element>を使用する際の考慮事項

WSDLvisibility属性をtrueに設定すると、ビューのWebサービス操作が生成され、WSDLドキュメントにこの操作の定義が含められます。次に示すように、<xqsview-source><output-element>の内容により、WSDL操作の出力メッセージのタイプが決定されます。

  • <output-element>を省略した場合、WSDL操作の出力メッセージの結果タイプは、次のように宣言されます。

    <sequence> <any/> </sequence>
    
  • <output-element>が存在する場合は、その中で、名前空間属性または接頭辞属性の書式で出力要素の名前空間が指定されている必要があります。この名前空間は、WSDLでは<import>要素になります。例:

    <output-element namespace="urn:PurchaseOrders"
                                           location="http://myhost:80/myapp/PurchaseOrders.xsd" />
    

    このコードにより、WSDLで次のインポート要素が生成されます。

    <types>
            <schema...>
               <import namespace="urn:PurchaseOrders" 
    schemaLocation="http://myhost:80/myapp/PurchaseOrders.xsd" />
    ...
    </schema>
    </types>
    

    ロケーション属性を使用することで、WSDLの<import>要素がより完全になります。そのため、ロケーション属性はできるかぎり指定してください。

  • <output-element>で属性タイプが指定される場合は、この属性がnamespace属性またはprefix属性とともに使用され、結果要素タイプの修飾名が作成されます。<output-element>のテキスト値は、結果要素自体の名前として使用されます。

    例:

    <output-element namespace="urn:PurchaseOrders"
                                           location="http://myhost:80/myapp/PurchaseOrders.xsd"
                                           type="POType" >
                                po
    </output-element>
    

    このコードは、前述の<import>要素と、次に示すWSDL操作の結果タイプの定義になります。

    <complexType name="POswithRetTypeResultType">
    ...
    <element name="result" nillable="true">
    <complexType >
    <sequence>
              <element name="po" xnlns:_ns1="urn:PurchaseOrders"  
    type="_ns1:POType" minOccurs="0" maxOccurs="unbounded" />
     </sequence>
    ...
    
  • <output-element>によってtype属性が指定されない場合は、WSDL操作の出力メッセージの結果要素は、インポートされたスキーマの要素への参照として宣言されます。たとえば、次の構成要素があるとします。

    <output-element namespace="urn:PurchaseOrders"
                                           location="http://myhost:80/myapp/PurchaseOrders.xsd">
                                polist
                            </output-element>
    

    このような要素は、WSDLで次のような結果定義を生成します。

    <complexType name="POListResultType">
    ...
    <element name="result" nillable="true">
    <complexType >
    <sequence>
                 <element ref="_ns1:polist"   minOccurs="0" maxOccurs="unbounded" />
    
    </sequence>
    ...
    
  • <output-element>によってtype属性が指定されていても、それが空の(text要素値がない)場合、XQSでは、結果要素の固定名itemが使用されますが、指定されたタイプ名が使用されます。たとえば、次の構成があるとします。

    <output-element namespace="urn:PurchaseOrders"
                                           location="http://myhost:80/myapp/PurchaseOrders.xsd"
                                           type="POType" />
    

    このような構成では、次のような結果要素の定義が生成されます。

    <complexType name="POsResultType">
    ...
    <element name="result" nillable="true">
    <complexType >
    <sequence>
              <element name="item" xnlns:_ns1="urn:PurchaseOrders"  
    type="_ns1:POType" minOccurs="0" maxOccurs="unbounded" />
     </sequence>
    

重要:

(WSDLのtype属性を介して)結果要素を定義するタイプ、または(WSDLのref属性を介して)参照によって結果要素を定義する要素は、インポートされたスキーマのトップレベルのタイプまたは要素の定義を参照する必要があります。前述の例では、POTypeが、名前空間urn:PurchaseOrdersに対してインポートされたスキーマでトップレベルのタイプ定義であるか、(参照による要素定義に使用する)polistが、次の場所で、インポートされたスキーマのトップレベルで定義されている必要があります。

http://myhost:80/myapp/PurchaseOrders.xsd


SQLベースのXQSビューに固有の考慮事項(必須)

<dataSource>: XQSにデータベース接続情報を提供します。SQL問合せに基づいたXQSビューには、<dataSource>構成要素が必須です。OC4J data-sources.xml構成ファイルの<managed-data-source>または<data-source>要素に定義されているように、<dataSource>要素にはデータソースのJNDI名が含まれている必要があります。

パフォーマンスとエラー処理

エラー処理の設定を行い、キャッシングやラージ・データセットの特別な処理などのパフォーマンス機能の使用を指定できます。これらの設定には、<xqsview-source>の属性isCachedlargeDataonError、およびサブ要素の<cache-properties><error-message>を使用します。これらの機能の構成は、ここでは省略します。「XQSエラー処理モードおよびAPIの使用方法」および「XQSパフォーマンス機能の使用方法」を参照してください。

次の例では、前に示したそれぞれの部分を1つにまとめてXQS関数totalsが構成されています。また、文字列変数loc(ファイルの場所用)を使用して整数の結果が出力されます。便宜上、ここでもXQSビューmytotals.xqを使用します。

declare variable $loc external;
declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:readFile($l as xs:string) external;
for $po in xqs:readFile($loc)//po return $po//total

この例では、キャッシング、ラージ・データおよびエラー処理のデフォルト設定が使用されています。これは、<xqsview-source>属性がisCached="false"largeData="false"およびonError="dynamicError"と設定されていることと同じです。XQSは、Webサービスとして公開されません。

<xqsview-source WSDLvisibility="false">
   <function-name namespace="http://xmlns.oracle.com/ias/xqs">
      totals
   </function-name>
   <input-parameters type-match="none" >
      <part position="1" name="loc">
         <schema-type prefix="xs">string</schema-type>
      </part>
   </input-parameters>
   <repository>META-INF/xqs/mydir</repository>
   <queryName>mytotals</queryName>
   <output-element prefix="xs">int</output-element>
</xqsview-source>

WSDLソースにアクセスするXQS関数の構成

この項では、WSDLベースのソースにアクセスするXQS関数の構成方法について説明し、最後にWSDLドキュメントの一部分の例および対応する構成を示します。この項に出てくる要素は、<wsdl-source>要素のサブ要素です。追加情報は、「<wsdl-source>」を参照してください。すべてのサブ要素の情報へのリンクも含まれています。

使用するWSDLソースのタイプにより、「SOAPバインディングを伴うWSDLソースを使用するための準備」または「カスタム・クラスまたはEJBを使用するための準備(JavaまたはEJBのバインディングを伴うWSDLソース)」も参照してください。

必須

WSDLソースに対して、少なくとも次の要素を構成する必要があります。

  • <function-name>: この要素を介して、WSDLソースへのアクセス用にXQSによって実装されるXQS関数の修飾名を指定します。この要素の値はローカル名で、名前空間の属性(「<function-name>」で説明しているようにnamespaceまたはprefix)があります。XQS関数をXQuery外部関数として宣言する際には、XQueryのプロローグでも同じ名前を使用する必要があります。

    構成の例を示します。

    <wsdl-source ... >
       <function-name namespace="http://xmlns.oracle.com/ias/xqs">
          getmySearchCachedPage
       </function-name>
       ...
    </wsdl-source>
    
  • <input-parameters>: それぞれのWSDLソースで、XQSによって実装される関数は、WSDLで指定された入力パートごとに1つの入力パラメータを使用する必要があります。<input-parameters>要素を使用して、入力パラメータを構成します。その際には、パラメータごとに1つの<part>サブ要素を使用します。WSDLソースでは、この要素は常に必須です。入力パラメータがない場合は、空の要素を使用してください。

    <wsdl-source ... >
       ...
       <input-parameters/>
       ...
    </wsdl-source>
    

    次に、2つの入力パラメータを使用した例を示します。ここでは、外部文字列変数keyおよびurlを使用しています。<schema-type>要素を介して指定するタイプ情報は、WSDLソースの入力パラメータでは必須ではありませんが、使用すると、Webサービスの起動時にタイプ・チェックを実行できます。次の例は、xs接頭辞がXML Schemaの名前空間に対応するように設定されていることを前提としています。(<input-parameters><part>および<schema-type>の各要素の詳細は、この章の後半部分に含まれているリファレンス・ドキュメントを参照してください。)

    <wsdl-source ... >
       ...
       <input-parameters>
          <part position="1" name="key" >
             <schema-type prefix="xs">string</schema-type>
          </part>
          <part position="2" name="url" >
             <schema-type prefix="xs">string</schema-type>
          </part>
       </input-parameters>
       ...
    </wsdl-source>
    
  • <wsdlURL>: URLを指定して、XQSに対し、WSDLドキュメントの検索場所を指示します。例:

    <wsdl-source ... >
       ...
       <wsdlURL>http://api.mySearch.com/mySearch.wsdl</wsdlURL>
       ...
    </wsdl-source>
    
  • <operation>: WSDL内の操作名に対応する、実行対象のWebサービス操作を指定します。例:

    <wsdl-source ... >
       ...
       <operation>doGetCachedPage</operation>
       ...
    </wsdl-source>
    
  • <port>: WSDL内のポート名に対応する、適切なWebサービス・ポートを指定します。例:

    <wsdl-source ... >
       ...
       <port namespace="urn:mySearch">mySearchPort</port>
       ...
    </wsdl-source>
    

前述の例で使用された<function-name>および<input-parameters>の例に対応する、関数の宣言の例を示します。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:getmySearchCachedPage ($key as xs:string, $url as xs:string)
        as xs:base64Binary external;

オプション(場合によっては必須)

場合により必須または適切であるWSDLソースの要素は、次のとおりです。

  • <service>: この要素を使用して、WSDL内のサービス名に対応する、適切なサービスを指定します。この要素は、WSDLによって1つのサービスしか定義されない場合のみ、オプションです。サービスの構成の例を示します。

    <wsdl-source ... >
       ...
       <service namespace="urn:mySearch">mySearchService</service>
       ...
    </wsdl-source>
    
  • <portType>: この要素を使用して、WSDL内のポート・タイプ名に対応する、適切なポート・タイプを指定します。この要素は、WSDLで1つのバインディングのみ(つまり、1つのポート・タイプのみ)がサポートされている場合にかぎり、オプションです。ポート・タイプの構成の例を示します。

    <wsdl-source ... >
       ...
       <portType namespace="urn:mySearch">mySearchPort</portType>
       ...
    </wsdl-source>
    
  • <output-element>: オプションでこの要素を使用すると、XML要素の修飾名または戻されたデータの出力型(単純型または複合型)を指定できます。この要素は必須ではありませんが、この情報は、XQSによるタイプ・チェックに使用されます。次に例を示します。

    <wsdl-source ... >
       ...
       <output-element namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
                    location="http://host:port/xqsdemos/Customers.xsd"> type="Customers>
       </output-element>
       ...
    </wsdl-source>
    
  • <typeMap>: JavaまたはEJBのバインディングを伴うWSDLソースでは、この要素を使用してXML型をJava型にマップできます。その際には、次に示すように、サブ要素<mapping>およびそのサブ要素<xmlType>を使用します。(<typeMap><mapping>および<xmlType>の各要素の詳細は、この章の後半部分に含まれているリファレンス・ドキュメントを参照してください。)

    <wsdl-source ... >
       ...
       <typeMap>
          <mapping typeClass="org.w3c.dom.Node">
             <xmlType prefix="myeis">Customer</xmlType>
          </mapping>
          ...
       </typeMap>
       ...
    </wsdl-source>
    

    <typeMap>要素は、SOAPのバインディングを伴うWSDLソースでは無視されます。)

パフォーマンスとエラー処理

エラー処理の設定を行い、キャッシングの使用を指定できます。これらの設定には、<wsdl-source>の属性isCachedonError、およびサブ要素の<cache-properties><error-message>を使用します。これらの機能の構成は、ここでは省略します。「XQSエラー処理モードおよびAPIの使用方法」および「XQSキャッシングの構成」を参照してください。

この例では、前に示したそれぞれの部分のいくつかを1つにまとめて、(この後に説明する)mySearch.wsdlで定義されるWebサービス操作のXQS関数が構成されます。

次の例では、キャッシングおよびエラー処理のデフォルト設定が使用されています。これは、<wsdl-source>属性がisCached="false"およびonError="dynamicError"と設定されていることと同じです。

<wsdl-source>
   <function-name namespace="http://xmlns.oracle.com/ias/xqs">
      getmySearchCachedPage
   </function-name>
   <wsdlURL>http://api.mySearch.com/mySearch.wsdl</wsdlURL>
   <operation>doGetCachedPage</operation>
   <service namespace="urn:mySearch">mySearchService</service>
   <port namespace="urn:mySearch">mySearchPort</port>
   <input-parameters>
      <part position="1" name="key" >
         <schema-type prefix="xs">string</schema-type>
      </part>
      <part position="2" name="url" >
         <schema-type prefix="xs">string</schema-type>
      </part>
   </input-parameters>
</wsdl-source>

mySearch.wsdl

次に示すのは、前述の構成に関連するmySearch.wsdlの各部分です。WSDLの太字で示した部分は、構成要素に対応します。

<?xml version="1.0" ?>

<definitions name="mySearch" targetNamespace="urn:mySearch"
   xmlns:typens="urn:mySearch"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
   xmlns="http://schemas.xmlsoap.org/wsdl/">
   ...
   <message name="doGetCachedPage">
      <part name="key" type="xs:string" /> 
      <part name="url" type="xs:string" />
   </message>
   <message name="doGetCachedPageResponse">
      <part name="return" type="xs:base64Binary" />
   </message>
   ...
   <portType name="mySearchPort">
      <operation name="doGetCachedPage">
         <input message="typens:doGetCachedPage" />
         <output message="typens:doGetCachedPageResponse" />
      </operation>
      ...
   </portType>
   ...
   <binding name="mySearchBinding" type="typens:mySearchPort">
      <soap:binding style="rpc"
                    transport="http://schemas.xmlsoap.org/soap/http" />
      <operation name="doGetCachedPage">
         <soap:operation soapAction="urn:mySearchAction" />
         <input>
            <soap:body use="encoded" namespace="urn:mySearch"
               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body use="encoded" namespace="urn:mySearch"
               encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      ...
   </binding>
   ...
   <service name="mySearchService">
      <port name="mySearchPort" binding="typens:mySearchBinding">
         <soap:address location="http://api.mySearch.com/search/beta2" />
      </port>
   </service>
</definitions>

問合せの設計方法

この章の内容は、開発者がすでにXQuery言語および効果的で効率的な問合せの設計方法の基礎を理解していることを前提としていますが、この項では、XQSを使用する際の特別な考慮事項など、重要なポイントを要約し、問合せの例を示します。この章には、次の項目が含まれます。


注意:

  • Oracleでは、XQuery 1.0を完全にサポートしているため、XQueryによってサポートされるすべての構文を使用できます。

  • 問合せの開発には、Oracle JDeveloperのクエリー・ビルダーや任意のサード・パーティのツールを使用できますが、JDeveloperを含むすべてのツールで、現時点ではXQS用の特別なサポートは提供されていません。


問合せの考慮事項

最初の手順として、当然ながらデータソースを考慮する必要があります。これには、アクセス方法や含まれるデータのタイプも含まれます。一部のデータソースに対して行う必要がある準備手順は、「データソースを使用するための準備」で前述しています。

次に、問合せ自体の様々な側面を考慮する必要があります。これには、次のことが含まれます。

  • 問合せによって入力パラメータが要求されるかどうか。要求される場合は、タイプ・チェックを実行するかどうか。(「入力パラメータのタイプ・チェック」を参照してください。)

  • 入力パラメータのデータ型および問合せの戻り値のデータ型。

  • データを変換し、別のXML構造として出力するかどうか。

  • 非定型問合せを使用するか、または問合せをXQSビュー(.xqファイル)として保存するか。

  • チューニングおよびパフォーマンスに関する考慮事項、およびXQSのパフォーマンス機能を使用するかどうか。XQSでは、ソースデータをキャッシュできるほか、大量のデータを処理するための特別なモードも装備しています。(詳細は、「XQSパフォーマンス機能の使用方法」を参照してください。)

前述のように、XQSでは、データソースにアクセスするための外部XQuery関数が実装されます。XQSによって作成されるこの関数の宣言を、選択した関数名を使用してXQueryのプロローグに含める必要があります。また、このプロローグは、適切な名前空間を参照する必要があります。宣言する関数名は、データソースの構成時に<function-name>要素で指定した名前と一致する必要があります。(「XQS関数の構成方法」を参照してください)。

問合せの例

XML文書からデータを取得する、単純な問合せを次に示します。このドキュメントの場所は、実行時にXQS関数に渡されます。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:get_poSQ($bind as xs:string) external;
for $po in xqs:get_poSQ("http://host:port/xqsdemos/Repository/pos-2KB.xml")
return  $po

XQSでは、XQS構成に基づいて関数が実装されます。関数名(この例ではget_poSQ)は、ユーザーが選択する名前です。この関数は、ドキュメント・ソースpos-2KB.xmlの名前と場所を示す文字列を入力として使用し、このファイルから注文(purchase order)データを戻します。

次に、XQueryコードを介してパラメータ値を渡す問合せの例を示します。このXQS関数はexampleで、構成に基づいてXQSによって実装されます。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare function xqs:example($i as xs:int, $d as xs:duration,
                             $h as xs:hexBinary, $bin as xs:base64Binary,
                             $t as xs:boolean) external;

for $result in xqs:example(xs:int(1),
                           xs:duration("P1Y2MT2H"),
                           xs:hexBinary("0FB7"),
                           xs:base64Binary("vYrfOJ39673//-BDiIIGHSPM=+"),
                           xs:boolean("true"))
return $result;

次に、より複雑な問合せの例を示します。この問合せでは、顧客の名前を指定すると、その顧客の注文に関する支払記録が検索されます。そして、顧客の情報および注文が戻されます。この例には、2つのデータソースが関係しています。1)顧客情報はWSIFのカスタム拡張機能myeisを介してアクセスされます。2)支払情報はExcelシート(XML以外のドキュメント・ソース)に保存されています。顧客情報のデータソースへのアクセスには、XQS関数customerInfoが使用され、顧客名を示す文字列が入力として使用されます。この関数は、顧客情報のデータソースにアクセスし、指定された顧客の情報(顧客キーを含む)を生成します。その後、XQS関数paymentStatusInfoを使用して支払情報のExcelファイルにアクセスし、顧客情報のデータソースと同じキーを持つ顧客の注文情報を戻します。このXQueryコードには、結果のXML変換が含まれています。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
(: returns payment info for all customers:)
declare function xqs:paymentStatusInfo() external;

(: returns customer info given customer name :)
declare function xqs:customerInfo ($name as xs:string) external;

(: customer name passed in to query :)
declare variable $custName external;

let $custInfo := xqs:customerInfo($custName)
for $custOrderInfo in xqs:paymentStatusInfo()/excel/Row[CustomerKey eq $custInfo/key]
return
   <result>
      <MYEIS_RESULT>
         <Row>
            <Name> { $custInfo/name } </Name>
            <Company> { $custInfo/company} </Company>
            <Address> { $custInfo/address} </Address>
            <City> { $custInfo/city} </City>
            <State> { $custInfo/state} </State>
            <Zip> { $custInfo/zip} </Zip>
         </Row>
      </MYEIS_RESULT>
      <EXCEL_RESULT>
         <Row>
            <OrderID>{$custOrderInfo/OrderId}</OrderID>
            <Amount>{$custOrderInfo/Amount}</Amount>
            <PaymentStatus>{$custOrderInfo/PaymentStatus}</PaymentStatus>
         </Row>
      </EXCEL_RESULT>
   </result>

入力パラメータのタイプ・チェック

WSDLソースまたはXQSビューで、基礎となるデータソースに入力引数を送る前に、XQueryによる追加のタイプ・チェックの手順を実行する場合は、次の手順を行います。

  1. <input-parameters>要素の下にある<part>サブ要素を介して、構成内で適切なXQS関数に対して指定した入力パラメータごとに、パラメータ・タイプを指定します。XQSビュー・ソースの場合は、必要に応じて、次のいずれかを介して指定します。

    • <part><schema-type>サブ要素

    • 入力順序の場合は、<part><xquery-sequence>サブ要素、および<xquery-sequence><itemType>サブ要素

    WSDLソースの場合は、順序は入力としてサポートされないため、関係があるのは<schema-type>のみです。

    (これらの各要素の詳細は、この章の後半部分に含まれているリファレンス・ドキュメントを参照してください。)

  2. XQueryのプロローグで関数を宣言する際に、パラメータ・タイプを含めます。

  3. 入力パラメータがユーザー定義タイプの場合は、タイプ定義を含むスキーマまたはファイルをインポートします。

次に例を示します。最初はXQS構成です。

<wsdl-source isCached="false">
   <function-name namespace="http://xmlns.oracle.com/ias/xqs">
      SplitRatio
   </function-name>
   ...
   <input-parameters>
      <part position="1" name="parameters">
         <schema-type namespace="http://www.xignite.com/services/">
            GetSplitRatio
         </schema-type>
      </part>
   </input-parameters>
</wsdl-source>

次は、対応するXQuery式です。

import schema namespace xignite="http://www.xignite.com/services/"
       at "http://www.xignite.com/xSecurity.asmx?wsdl"
declare namespace xqs="http://xmlns.oracle.com/ias/xqs";
declare function xqs:SplitRatio($params as xignite:GetSplitRatio)
        as xignite:GetSplitRatioResponse external;

let $in := <xignite:GetSplitRatio> .....</xignite:GetSplitRatio>

let $y := xqs:SplitRatio($in) return <split>$y//xignite:Ratio</split>

実行時に、xqs:SplitRatioに渡された引数のタイプが、インポートされたスキーマのタイプxignite:GetSplitRatioであることがXQueryによって確認されます。

アプリケーション・コードの開発方法: XQSクライアント・インタフェースを使用した場合

この項では、(「XQSクライアント・インタフェースの概要」で最初に説明した)XQSで提供されるクライアントAPIを使用する場合の手順について説明し、例を示します。ここでは、JavaクライアントAPI、EJBクライアントAPIおよびJSPタグ・ライブラリについて説明します。Webサービス・クライアントに関して、XQSビューをWebサービス操作として公開するXQSの詳細は、パッケージ化の項で後述しています(「XQSビューをWebサービス操作として公開するためのOC4JPackagerの追加の出力」を参照)。それ以外では、XQSによってSOAP 1.1バインディングを伴う標準のWSDLが生成されます。ここに示す内容は、Webサービス・クライアントの作成に関する知識があることを前提としています。


注意:

XQSでは、Webサービス・クライアント用のJavaコードは生成されません。各ユーザーの責任において、Webサービスを動的に起動するか、WSDLに基づいてクライアント起動コードを生成してください。

この項には、次の項目が含まれます。


注意:

  • XQSクライアント・インタフェースを使用する前に、「データソースを使用するための準備」および「XQS関数の構成方法」の説明に従って、データソースの準備と構成を完了しておく必要があります。また、EJBを使用する場合はejb-jar.xmlファイル、Webモジュールを使用する場合はweb.xmlファイルなど、追加の構成もすべて完了しておく必要があります。

  • どのクライアントAPIを使用するかは、使用するデータソースのタイプとは関係しません。これらは、完全に区別して考慮してください。


サポートされている問合せパラメータのタイプ

XQSのoracle.xqs.client.QueryParameterIインタフェースは、XQSのJavaクライアントAPIおよびEJBクライアントAPIで、問合せ用のバインド・パラメータの配列に使用します。このクラスは、XQSのJSPタグ・ライブラリでも、背後で使用されます。(追加情報は、「XQS QueryParameterIリファレンス」を参照してください。)表8-2は、XQSでサポートされているXML型、およびQueryParameterIインタフェースのインスタンスを介して入力値を渡すために使用するJava型の対応を示しています。

表8-2 バインド・パラメータ用にXQSでサポートされている型

サポートされているXML型 QueryParameterIインタフェースの対応するJava型

boolean

boolean

string

java.lang.String

int

int

integer

int、long、java.math.BigInteger

long

long

float

float

double

double

decimal

java.math.BigDecimal

base64Binary

java.lang.String

hexBinary

java.lang.String

anyURI

java.net.URI

dateTime

java.util.GregorianCalendar

(前提条件: カレンダ値のタイムゾーンが適切に初期化されていること)

java.lang.String(dateTimeの字句表現。説明はhttp://www.w3.org/TR/xmlschema-2/#dateTimeを参照)

duration

java.lang.String(期間の字句表現。説明はhttp://www.w3.org/TR/xmlschema-2/#durationを参照)

dayTimeDuration

double

(dayTime期間の秒単位の表現)

yearMonthDuration

int

(yearMonth期間の月単位の表現)

anyType、ユーザー定義のXML型

org.w3c.dom.Node


XQSクライアントAPIを使用するための一般的なコーディング手順

XQSクライアントAPIを使用するためには、次に示す、基本的なコーディング手順を行います。

  1. 問合せを作成します。非定型問合せを使用する場合は、問合せをハードコードするか、ユーザー入力からの問合せを受け入れるコードを記述します。XQSビューを使用する場合は、.xqファイルに問合せを保存します。「問合せの設計方法」も参照してください。

  2. 静的メソッドgetXQSFacade()を使用して、またはJSPページにXQS JSPタグ・ライブラリを含めることで、XQSFactoryファクトリからXQSFacadeIインタフェースのインスタンスを取得します。

  3. 入力パラメータを指定します。JavaクライアントAPIまたはEJB APIの場合は、タイプoracle.xqs.client.QueryParameterIの配列を作成し、静的メソッドgetQueryParameter()を使用してXQSFactoryファクトリからQueryParameterIインタフェースのインスタンスを取得して、その配列を移入します。(「XQS QueryParameterIリファレンス」を参照してください。)JSPタグ・ライブラリの場合は、executeまたはexecuteCursorparamサブタグを使用します。(「XQS paramタグ」を参照してください。)前項の「サポートされている問合せパラメータのタイプ」も参照してください。

  4. 問合せを実行します。

  5. 結果を読み取り、処理します。ステートレス・クライアントの場合は、XQSによって、java.util.Vectorインスタンス内に一度にすべての結果が戻されるか、(JSPタグを使用している場合は)java.util.ArrayListインスタンスとXML文書が戻されます。ステートフル・クライアントの場合は、Oracle XQueryタイプoracle.xml.xqxp.datamodel.XMLItemを使用するか、(JSPタグを使用している場合は)java.lang.ObjectインスタンスとXML文書のノードを使用して、アイテムごとに結果を取得します。XQS EJB APIおよびJSPタグ・ライブラリの場合は、ステートレスとステートフルのいずれかのアクセス・パターンを選択して使用できます。

    XQSFacadeIインタフェースでは、ステートフル・アクセス・パターンを使用します。XQSFacadeIインタフェースの使用に関する情報は、「Javaインタフェース・クライアントAPIの使用方法」を参照してください。

  6. 必要に応じて、エラーを取得し処理します。問合せのXQS関数の実行中にエラーが発生した場合でも処理が続行されるようにXQSを構成した場合は、エラーに関する情報を取得できます。「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

  7. ステートフル・クライアントの使用時には、クライアント・オブジェクトをクローズして、問合せに関連付けられているすべてのリソースを解放します。


注意:

ここでは、セキュリティまたはパフォーマンスの考慮事項については言及しません。これらの項目の情報は、「XQSアプリケーションのセキュリティ」および「XQSパフォーマンス機能の使用方法」を参照してください。

ステートフル・クライアントとステートレス・クライアント

XQSクライアントAPIは、問合せ結果をXML順序として戻します。この順序には1つ以上のXML項目が含まれ、各項目は、XML文書、XMLノードまたはプリミティブ値になります。問合せを実行することで、結果は定義されますが、すべての結果項目が即座にマテリアライズされてプロセス・メモリーに格納されるわけではないことを認識しておくことが重要です。リレーショナル問合せの結果セットのように、XML順序でのカーソルの位置は、最初の項目の前になるように暗黙的に維持されており、次へ移動するための(next)操作で移動できます。暗黙カーソルを使用して次へ(next)の操作のコールを繰り返すことでXML順序にアクセスした場合は、次への操作をコールするたびに、要求された次の項目を作成するためのXQuery式の評価が、実際にトリガーされる可能性があります。XQueryによって式が評価される正確なタイミング、また、評価が段階的に行われるか一度に全部行われるかは、そのXQuery式およびXQuery実装の最適化レベルによって異なります。XQSクライアントAPIでは、このようにカーソルでアクセスするかわりに、シングル・ステップですべての問合せ結果を読み取り、プロセス・メモリーに格納することもできます。

シングル・ステップ・モードおよびカーソル・モードの実行には、それぞれ長所と短所があります。ほとんどの状況では、シングル・ステップによる実行が適しています。これは、関連するリソース(基礎となるデータソースへの接続、およびその式専用の内部XQueryリソース)が、実行の完了後にただちに解放されるためです。また、データソースへ繰り返しアクセスすることによるパフォーマンスへの潜在的な影響を受けることもありません。ただし、結果順序に含まれる項目の全体のサイズが大きすぎて、順序全体を一度にマテリアライズするとプロセス・メモリーが不足する場合には、シングル・ステップによる実行を使用できません。このような場合は、問合せが結果を項目ごとに提供するのを妨げるもの(たとえば集計式など)がないかぎり、カーソル・モードが唯一の手段になります。

シングル・ステップ・モードまたはカーソル・モードを選択できるように、XQSでは2種類のクライアントAPIを用意しています。シングル・ステップ・モード用のステートレスおよびカーソル・モード用のステートフルです。(この場合の「ステート」は、XQueryエンジンの内部状態を指します。)これらのクライアントAPIは、次のように動作します。

  • ステートレスAPIを介してXQuery式を実行した場合は、結果順序全体が一度にマテリアライズされ、すべての内部状態およびリソースが、直後に解放されます。ステートレス実行の唯一の要件は、結果順序全体がプロセス・メモリーに収まることです。

  • 対照的に、ステートフルAPIを介してXQuery式を実行した場合は、現在の位置が結果順序の最初の項目の前になります。最初の項目から順番に各項目を取得するには、クライアントが次へ(next)の操作を起動する必要があります。問合せの状態は、現在の位置および次の項目を評価するのに必要なすべての内部リソースによって構成されます。この状態は、順序の最後の項目が戻されるか、問合せが明示的にクローズされるまで、解放されません。ただし、注意しなければならないのは、ステートフル実行の少ないメモリー要件を生かすには、クライアント・コードによって、各結果項目の処理後にその項目を解放する必要があるということです。

XQS EJBクライアントAPIおよびJSPクライアントAPIには、それぞれステートレス実行用の機能とステートフル実行用の機能があります。XQS Javaインタフェース(XQSFacadeI)クライアントAPIは、ステートフル・アクセスを提供します。すべての結果項目をただちに取得し、クライアント・オブジェクトを解放することで、ステートレス・アクセスをシミュレートできます。

Javaインタフェース・クライアントAPIの使用方法

「XQSクライアントAPIを使用するための一般的なコーディング手順」を参照してください。(問合せの作成後に)XQS JavaクライアントAPIを使用してこれらの手順を適用するには、次の手順に従います。

  1. 静的メソッドgetXQSFacade()を使用して、XQSFactoryファクトリからXQSFacadeIインタフェースのインスタンスを取得します。次の各手順のメソッド・コールは、このインスタンスからコールされます。

  2. 入力パラメータ用のQueryParameterI配列を作成し、静的メソッドgetQueryParameter()を使用してXQSFactoryファクトリからQueryParameterIインタフェースのインスタンスを取得して、その配列を移入します。

  3. execute()メソッドを使用して非定型問合せを実行するか、executeView()メソッドを使用してXQSビューを実行し、問合せとQueryParameterI配列(入力パラメータがない場合はnull)を渡します。executeView()を使用する場合は、そのビューのXQS関数の名前空間も渡します。

  4. 問合せ内で使用したデータソースの構成にemptySequenceエラー・モードまたはerrorMessageエラー・モードを使用した場合は、必要に応じてgetErrors()メソッドを使用して、問合せの実行時に発生したエラーを取得できます。これにより、XQSErrorIオブジェクトのコレクションに対するイテレータが戻されます。エラーの構成と処理の詳細は、「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

  5. getNextItem()メソッドを繰り返し使用して、項目ごとに結果を取得します。各項目は、XMLItemインスタンス内に戻されます。必要に応じてこれらの項目を処理します。

  6. close()メソッドを使用して、問合せに関連付けられているすべてのリソースを解放します。

これらの手順は、次の例の中で示されています。「XQSFacadeIリファレンス」も参照してください。

例1: XQSFacadeI API

この例は、XQSFacadeI APIの一般的な使用方法を示しています。この問合せでは、バインド・パラメータが順序内に戻され、バインド方法とデータの取得方法が示されます。関数が使用されないため、構成は不要です。

問合せ結果を処理するために、コードには(oracle.xml.xqxp.datamodelパッケージ内で)XMLItemクラスが使用されています。

import oracle.xml.xqxp.datamodel.XMLItem;
import oracle.xml.parser.v2.XMLDocument;
import oracle.xml.parser.v2.XMLElement;
import oracle.xqs.client.XQSFacadeI;
import oracle.xqs.client.QueryParameterI;
import oracle.xqs.client.XQSErrorI;
import java.util.Vector;

public class XQSFacadeITest {
public static void main(String[] args) throws Exception {
 try{
          //get XQSFacadeI
          XQSFacadeI facade = XQSFactory.getXQSFacade();
          String xquery = "declare variable $bind1 external;\n"+
             "declare variable $bind2 external;\n"+
             "declare variable $bind3 external;\n"+
             "declare variable $bind4 external;\n"+
             "declare variable $bind5 external;\n"+
             "declare variable $bind6 external;\n"+
             "declare variable $bind7 external;\n"+
             "declare variable $bind8 external;\n"+
             "declare variable $bind9 external;\n"+
             "declare variable $bind10 external;\n"+
             "declare variable $bind11 external;\n"+
             "declare variable $bind12 external;\n"+
             "declare variable $bind13 external;\n"+
             "declare variable $bind14 external;\n"+
             "declare variable $bind15 external;\n"+
             "declare variable $bind16 external;\n"+
             "("+"$bind1,$bind2,$bind3,$bind4,$bind5,$bind6,$bind7,\n"+
             "$bind8,$bind9,$bind10,$bind11,$bind12,$bind13,$bind14,$bind15,
                $bind16)";

          QueryParameterI params[] = new QueryParameterI[16];
          params[0]=XQSFactory.getQueryParameter ("bind1");
          params[0].setString("test");
          params[1]=XQSFactory.getQueryParameter ("bind2");
          params[1].setInteger(new BigInteger("100"));
          params[2]=XQSFactory.getQueryParameter ("bind3");
          params[2].setBoolean(true);
          params[3]=XQSFactory.getQueryParameter ("bind4");
          params[3].setFloat(-1);
          params[4]=XQSFactory.getQueryParameter ("bind5");
          params[4].setDuration("P1Y2M3DT10H30M");
          params[5]=XQSFactory.getQueryParameter ("bind6");
          params[5].setDouble(-11.0);

          TimeZone LAtz = new SimpleTimeZone(-28800000,
          "America/Los_Angeles",
                Calendar.APRIL, 1, -Calendar.SUNDAY,
                7200000,
                Calendar.OCTOBER, -1, Calendar.SUNDAY,
                7200000,
                3600000);
          GregorianCalendar cal = new GregorianCalendar(LAtz);

       params[6]=XQSFactory.getQueryParameter ("bind7");
       params[6].setDateTime(cal,true);

       URI uri = new URI("http://www.test.com");

       params[7]=XQSFactory.getQueryParameter ("bind8");
       params[7].setAnyURI(uri);
       params[8]=XQSFactory.getQueryParameter ("bind9");
       params[8].setInt(-7);
       params[9]=XQSFactory.getQueryParameter ("bind10");
       params[9].setLong(50l);
       params[10]=XQSFactory.getQueryParameter ("bind11");
       params[10].setDecimal(new BigDecimal(999999));
       params[11]=XQSFactory.getQueryParameter ("bind12");
       XMLDocument document = new XMLDocument();

          Element elem = document.createElementNS("http://client.xqs.oracle/",
             "tns:result");
          document.appendChild(elem);

       params[11].setNode(elem);
       params[12]=XQSFactory.getQueryParameter ("bind13");
       params[12].setBase64Binary("vYrfOJ39673//-BDiIIGHSPM=+");
       params[13]=XQSFactory.getQueryParameter ("bind14");
       params[13].setHexBinary("0FB7");
       params[14]=XQSFactory.getQueryParameter ("bind15");
       params[14].setDayTimeDuration(60.5);
       params[15]=XQSFactory.getQueryParameter ("bind16");
       params[15].setYearMonthDuration(13);

       facade.execute(xquery, params);
       // lookup functions
       XMLItem item = facade.getNextItem();

       while(item != null) {
         if (item.instanceOfType(XMLItem.XMLITEM_STRING)) {
            System.out.println("string item value: expected: \"test\",
            actual:", item.getString());
         }
         else if (item.instanceOfType(XMLItem.XMLITEM_INT)) {
            System.out.println("int item value: expected: \"-7\", actual: ",
            item.getInt());
         }
         else if (item.instanceOfType(XMLItem.XMLITEM_LONG)) {
            System.out.println("long item value: expected: \"501\", actual: ",
            item.getInt());
         }
         else if(item.instanceOfType(XMLItem.XMLITEM_INTEGER)) {
            if(item.intFormat())
               System.out.println("integer item value: expected: \"100\",
               actual:", item.getInt());
            else
              System.out.println("integer item value: expected: \"100\",
              actual: ", item.getDecimal().intValue());
            }
            else if(item.instanceOfType(XMLItem.XMLITEM_BOOLEAN)) {
               System.out.println("boolean item value: expected: \"true\",
               actual: ", item.getBoolean());
            }
            else if(item.instanceOfType(XMLItem.XMLITEM_FLOAT)) {
               System.out.println("float item value: expected: \"-1\",
               actual: ",(float)item.getDouble());
            }
            else if (item.instanceOfType(XMLItem.XMLITEM_XDT_DAYTIMEDURATION)) {
               System.out.println("dayTimeDuration item value: expected: \"60.5
               seconds\", actual: ", item.getDayTimeDuration());
            }
            else if (item.instanceOfType(XMLItem.XMLITEM_XDT_YEARMONTHDURATION)) {
               System.out.println("yearMonthDuration item value: expected: \"13
               months\", actual: ",  item.getYearMonthDuration());
            }
            else if (item.instanceOfType(XMLItem.XMLITEM_DURATION)) {
               System.out.println("duration item value: expected: \"
               P1Y2M3DT10H30M \", actual: ", item.getLexicalValue());
            }
            else if(item.instanceOfType(XMLItem.XMLITEM_DOUBLE)) {
               System.out.println("double item value: expected: \" –11.0\",
               actual: ", item.getDouble());
            }
            else if(item.instanceOfType(XMLItem.XMLITEM_DATETIME)) {
               System.out.println("dateTime item value: expected Timezone:
               \"Pacific (Latz) \", actual: ", item.getCalendar().getTimeZone());
            }
            else if (item.instanceOfType(XMLItem.XMLITEM_ANYURI)) {
               System.out.println("anyURI item value: expected:
               \"http://www.test.com\", actual: ", item.getString());
            }
            else if (item.instanceOfType(XMLItem.XMLITEM_DECIMAL)) {
               System.out.println("decimal item value: expected: \"999999 \",
               actual: ", item.getDecimal().intValue());
         }
         else if(item.instanceOfType(XMLItem.XMLITEM_NODE))
         {
            XMLElement node = (XMLElement)item.getNode();

            //when obtained from document function, it returns XMLDocument
            if(node instanceof XMLDocument)
               node = (XMLElement)node.getFirstChild();
            System.out.println("node item value: expected namespace: \"
               http://client.xqs.oracle \", actual: ",node.getNamespaceURI());
            System.out.println("node item value: expected local name: \"result\",
               actual: ",node.getLocalName());
         }
         else if (item.instanceOfType(XMLItem.XMLITEM_HEXBINARY)) {
            System.out.println("hexBinary item value: expected: \"0FB7\",
               actual: ", item.getString());
         }
         else if (item.instanceOfType(XMLItem.XMLITEM_BASE64BINARY)) {
            System.out.println("base64Binary item value: expected: \"
               vYrfOJ39673//-BDiIIGHSPM=+ \", actual: ", item.getString());
         }
         else
            {
            System.out.println("item type not supported:"+item.getLexicalValue());
            }
            item = facade.getNextItem();
         }
      }catch(Exception ex){
         ex.printStackTrace();
         fail(ex.getMessage());
         assertTrue("xquery execution failed", false);
    }
    facade.close();
  }
}

例2: XQSFacadeI APIを使用した非定型問合せ

この項では、Javaクラスを使用して、クライアント・コード内のXQSFacadeI APIおよび関連するXQS構成の使用の手順を示します。この例の非定型問合せでは、XQSソースが使用されます。また、このXQSソースでは、ドキュメント・ソースが使用されます。

問合せ この例では、次の非定型問合せが使用されます。

declare namespace xqs="http://xmlns.oracle.com/ias/xqs";
declare function xqs:get_poSQ($bind as xs:string) external;
for $po in xqs:get_poSQ("http://localhost:8888/myrepository/pos-2KB.xml")
    return $po

構成 次に、この問合せで、次の例に示すように構成されたXQSビュー・ソースに対応するXQS関数get_poSQが使用されます。.xqファイルの名前と場所を(<queryName>要素および<repository>要素を介して)構成内で指定しなかった場合、デフォルトでは、ファイル名は関数名、ファイルの場所はOC4JPackagerの実行時に-repositoryオプションを介して指定した場所であるとみなされます。

<xqsview-source>
   <function-name prefix="xqs">get_poSQ</function-name>
   <input-parameters>
      <part position="1" name="bind" >
         <schema-type prefix="xs">string</schema-type>
      </part>
   </input-parameters>
</xqsview-source>

ファイルget_poSQ.xqで定義されたXQSビューget_poSQでは、ドキュメント・ソースが使用されます。このドキュメント・ソースは、次のように定義されます。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs";
declare variable $bind external;
declare function xqs:genericFile($bind as xs:string) external;
for $po in xqs:genericFile($bind)//po
   return $po

また、ドキュメント・ソースgenericFileは、次のように構成されます。

<document-source>
   <function-name namespace="http://xmlns.oracle.com/ias/xqs">
      genericFile
   </function-name>
</document-source>

genericFile関数では、ドキュメントURLが入力として使用されるため、<documentURL>要素は使用されていません。

Javaコード 次はコードです。このコードは、次のことを行う完全なクラスです。

  • 静的メソッドgetXQSFacade()を使用して、XQSFactoryファクトリからXQSFacadeIインタフェースのインスタンスを取得します。 .

  • XQSビューget_poSQを使用する非定型問合せを定義します。問合せは文字列バッファxqueryBufに統合され、その後、文字列xqueryStrに格納されます。バックエンド・ドキュメント・ソースのURLは、get_poSQ関数によって入力として使用されます。

  • 問合せを実行します。この問合せには入力パラメータがないため、execute()メソッドに、QueryParameterI配列のかわりにnullが渡されます(次の、「例3: XQSFacadeI APIを使用したXQSビュー」の例では、入力パラメータが使用されています)。

  • ここではエラー処理については示していませんが、ソースの構成が適切であれば(エラー・モードerrorMessageまたはemptySequenceを使用)、エラー・オブジェクトを取得して処理できます。(次の例では、エラー処理についても示しています。もしくは、追加情報として、「XQSエラー処理モードおよびAPIの使用方法」を参照してください。)

  • whileループは、項目ごとに結果順序を経由します。そのため、ノード内の各項目は、XML文書docに格納されます。そこから、結果を表示したり、必要に応じてさらに処理できます(この時点からの処理は、XQS固有ではありません)。

  • close()コールにより、カーソルがクローズされ、関連付けられているリソースが解放されます。

import oracle.xml.xqxp.datamodel.XMLItem;
import oracle.xml.parser.v2.XMLDocument;
import oracle.xml.parser.v2.XMLElement;
import oracle.xml.parser.v2.XMLNode;
import oracle.xqs.client.XQSFacadeI;

public class XQSFacadeITest {

    public static void main(String[] args) throws Exception{
        XQSFacadeI bean = XQSFactory.getXQSFacade();
        StringBuffer xqueryBuf = new StringBuffer();
        xqueryBuf.append
             ("declare namespace xqs=\"http://xmlns.oracle.com/ias/xqs\";\n");
        xqueryBuf.append
             ("declare function xqs:get_poSQ($bind as xs:string) external;\n");
        xqueryBuf.append("for $po in xqs:get_poSQ
                     (\"http://localhost:8888/myrepository/pos-2KB.xml\") \n");
        xqueryBuf.append("return $po\n");

        String xqueryStr = xqueryBuf.toString();

        //no parameters to be bound, so pass null
        bean.execute(xqueryStr, null);

        XMLItem item = bean.getNextItem();

        XMLDocument doc = new XMLDocument();
        XMLElement rootElem = (XMLElement)doc.createElement("QueryResult");
        doc.appendChild(rootElem);

        while(item != null) {
            /* the test is actually superfluous - all items are expected to nodes
               for Purchase Order, here we show a standard treatment of items that
               are XML nodes, including entire documents
               (where node type is DOCUMENT_NODE)
            */
            if(item.getItemType().isNode()) {
                   rootElem.appendChild(doc.importNode(
                      item.getNode().getNodeType()==
                                         XMLNode.DOCUMENT_NODE?(XMLNode)
                      ((XMLDocument)item.getNode()).getDocumentElement():
                      (XMLNode)item.getNode(), true));
            }
            item = bean.getNextItem();
       }
       bean.close();
    }
}

例3: XQSFacadeI APIを使用したXQSビュー

この項では、XQSFacadeI APIを使用し、executeView()コールを介してXQSビューを直接実行する場合の例を示します。

構成 BasicFileWSという名前のXQSビューの構成を示します。

<xqsview-source WSDLvisibility="true" isCached="false" onError="errorMessage">
   <function-name  prefix="xqs">BasicFileWS</function-name>
   <input-parameters type-match="none" >
      <part position="1" name="custName">
         <schema-type prefix="xs">string</schema-type>
      </part>
   </input-parameters>
   <output-element namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
                location="http://host:port/xqsdemos/MyTypes.xsd" type="CustomerOrdersType">
   </output-element>
</xqsview-source>

<queryName>要素がないため、.xqファイルの名前は、(指定された関数名と同じ)BasicFileWS.xqとみなされます。このビューでは、文字列のパラメータcustNameが入力として使用されます。

次に、ビューBasicFileWS.xq「問合せの例」で前述した問合せ)の定義を示します。顧客名を入力として使用するための変数も含まれます。このビューでは、データソースに対して2つのXQS関数が使用されます。このデータソースの構成は、この例の後に示しています。

declare namespace xqs = "http://xmlns.oracle.com/ias/xqs" ;
(: returns payment info for all customers:)
declare function xqs:paymentStatusInfo () external;

(: returns customer info given customer name :)
declare function xqs:customerInfo ($name as xs:string) external;

(: customer name passed in to query :)
declare variable $custName external;

let $custInfo := xqs:customerInfo($custName)
for $custOrderInfo in xqs:paymentStatusInfo()/excel/Row[CustomerKey eq $custInfo/key]
return
   <result>
      <MYEIS_RESULT>
         <Row>
            <Name> { $custInfo/name } </Name>
            <Company> { $custInfo/company} </Company>
            <Address> { $custInfo/address} </Address>
            <City> { $custInfo/city} </City>
            <State> { $custInfo/state} </State>
            <Zip> { $custInfo/zip} </Zip>
         </Row>
      </MYEIS_RESULT>
      <EXCEL_RESULT>
         <Row>
            <OrderID>{$custOrderInfo/OrderId}</OrderID>
            <Amount>{$custOrderInfo/Amount}</Amount>
            <PaymentStatus>{$custOrderInfo/PaymentStatus}</PaymentStatus>
         </Row>
      </EXCEL_RESULT>
   </result>

次に、関数paymentStatusInfoに関連付けられているドキュメント・ソースの構成を示します。このドキュメントはXMLではないため、変換にD3Lが使用されます。(「XML以外のドキュメント・ソースを使用するための準備」を参照してください。)

<document-source isCached="false">
   <function-name prefix="xqs">paymentStatusInfo</function-name>
   <documentURL>http://host:port/xqsdemos/paymentInfo.csv</documentURL>
   <XMLTranslate method="D3L">
      <schema-file>
         http://host:port/xqsdemos/paymentInfoD3L.xml
      </schema-file>
   </XMLTranslate>
</document-source>

次に、関数customerInfoに関連付けられているWSDLソースの構成を示します。これには、JavaとXMLの型マッピングに関する情報も含まれます。

<wsdl-source isCached="false">
   <function-name  namespace="http://xmlns.oracle.com/ias/xqs">
      customerInfo
   </function-name>
   <wsdlURL>http://host:port/xqsdemos/CustomerInfo.wsdl</wsdlURL>
   <operation>getCustomer</operation>
   <service prefix="myeis">CustomerInfoMYEISService</service>
   <port prefix="myeis">CustomerInfo</port>
   <input-parameters>
      <part position="1" name="name">
         <schema-type prefix="xs">string</schema-type>
      </part>
   </input-parameters>
   <typeMap>
      <mapping typeClass="org.w3c.dom.Node">
         <xmlType prefix="myeis">
            Customer
         </xmlType>
      </mapping>
   </typeMap>
</wsdl-source>

Javaコード この項では、ビューBasicFileWSを実行するためのJavaコードを使用し、次のことを行う完全なクラスを示します。

  • 静的メソッドgetXQSFacade()を使用して、XQSFactoryファクトリからXQSFacadeIインタフェースのインスタンスを取得します。 .

  • 顧客名を入力するためのQueryParameterI配列を設定します。静的メソッドgetQueryParameter()を使用して、XQSFactoryファクトリからQueryParameterIインタフェースのインスタンスを取得します。顧客名を設定するには、QueryParameterIインタフェースのsetString()メソッドを使用します。

  • 問合せを実行します。executeView()メソッドに渡されるビュー名は、構成内でそのビューに関連付けられている関数名と一致する必要があります。このメソッドでは、関数の名前空間(同じく構成内で指定済)も使用されます。この例では、ビューはXQS名前空間で宣言されています。

  • エラーを処理します。XQSErrorIインタフェースのメソッドは、問合せ時に発生したエラーの情報を印刷するために使用します。その前提として、適切なXQSのエラー構成でemptySequenceモードまたはerrorMessage モードが使用されている必要があります。そうでない場合は、エラーが発生すると問合せが停止し、エラーのイテレータには有用な情報が含まれません。BasicFileWSの構成で示したように、この例では、errorMessageモードが使用されています。(追加情報は、「XQSエラー処理モードおよびAPIの使用方法」および「XQSErrorIリファレンス」を参照してください。)

  • 結果を処理します。問合せ結果は、(oracle.xml.xqxp.datamodelパッケージ内の)クラスXMLItemのインスタンスとして取得されます。XMLItemクラスの型定数および型固有のアクセッサを使用して、値が取得されます。

  • カーソルをクローズして、問合せに関連付けられているリソースを解放します。


注意:

XQS関数BasicFileWSexecuteView()コールで直接実行した場合は、この関数を宣言する必要はありません。

import oracle.xml.xqxp.datamodel.XMLItem;
import oracle.xml.parser.v2.XMLDocument;
import oracle.xml.parser.v2.XMLElement;
import oracle.xml.parser.v2.XMLNode;
import oracle.xqs.client.XQSFacadeI;
import oracle.xqs.client.XQSErrorI;
import oracle.xqs.client.QueryParameterI;

public class XQSFacadeIViewTest {

    public static void main(String[] args) throws Exception{
        XQSFacadeI facade = XQSFactory.getXQSFacade();
        String xqueryView = "BasicFileWS";
        QueryParameterI param = XQSFactory.getQueryParameter("custName");
        param.setString("John Ford");
        QueryParameterI[] params = new QueryParameterI[1];
        params[0] = param;

        facade.executeView(xqueryView, "http://xmlns.oracle.com/ias/xqs", params);

        java.util.ListIterator errors = facade.getErrors();
        while(errors.hasNext()) {
            XQSErrorI error = (XQSErrorI)errors.next();
            System.out.println
               ("The function which gives error is: " + error.getFunctionQName());

            System.out.println("The error type is: "+error.getErrorType()+ " which
               is - "+XQSErrorI.typeNames(error.getErrorType()));
            System.out.println("The error code is:" + error.getErrorCode());
            System.out.println("The error message is:" + error.getErrorMessage());
        }

        XMLItem item = facade.getNextItem();
        StringBuffer resultBuf = new StringBuffer();

        XMLDocument doc = new XMLDocument();
        XMLElement rootElem = (XMLElement)doc.createElement("QueryResult");
        doc.appendChild(rootElem);

        while(item != null) {
        if(item.instanceOfType(XMLItem.XMLITEM_STRING)) {
           resultBuf.append(item.getString());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_INT)) {
           resultBuf.append(item.getInt());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_LONG)) {
           resultBuf.append(item.getInt());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM INTEGER)) {
           if(item.intFormat())
               resultBuf.append(item.getInt());
           else
               resultBuf.append(item.getDecimal().intValue());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_BOOLEAN)) {
           resultBuf.append(item.getBoolean());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_FLOAT)) {
           resultBuf.append((float)item.getDouble());
        }        else if(item.instanceOfType(XMLItem.XMLITEM_DOUBLE)) {
           resultBuf.append(item.getDouble());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_XDT_DAYTIMEDURATION)) {
           resultBuf.append(item.getDayTimeDuration());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_YEARMONTHDURATION)) {
           resultBuf.append(item.getYearMonthDuration());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_DURATION)) {
           resultBuf.append(item.getLexicalValue());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_DATETIME)) {
           resultBuf.append(item.getCalendar().getTime());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_ANYURI)) {
           resultBuf.append(item.getString());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_DECIMAL)) {
           resultBuf.append(item.getDecimal().intValue());
        }        else if(item.instanceOfType(XMLItem.XMLITEM_NODE)) {
           resultBuf.append(item.getNode().getNodeName());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_HEXBINARY)) {
           resultBuf.append(item.getString());
        }
        else if(item.instanceOfType(XMLItem.XMLITEM_BASE64BINARY)) {
           resultBuf.append(item.getString());
        }

        item = facade.getNextItem();
        }
        facade.close();
    }
}

EJBクライアントAPIの使用方法

「XQSクライアントAPIを使用するための一般的なコーディング手順」を参照してください。XQS EJBクライアントAPIの場合は、(問合せの作成後に)ステートフル・セッションとステートレス・セッションのどちらを選択するかによって、次に示すように手順の詳細が異なります。

  1. 検索の実行、EJBローカル・ホーム・インタフェースの取得、ローカル・インタフェースの作成などを行って、Beanインスタンスの適切な作成手順を完了します。次の各手順のメソッド・コールは、このインスタンスからコールされます。ステートフルBeanとステートレスBeanの作成方法は、次の「ステートフル・セッション用およびステートレス・セッション用のEJBクライアント」の項を参照してください。

  2. 入力パラメータ用のQueryParameterI配列を作成し、静的メソッドgetQueryParameter()を使用してXQSFactoryファクトリからQueryParameterIインタフェースのインスタンスを取得して、その配列を移入します。

  3. execute()メソッドを使用して非定型問合せを実行するか、executeView()メソッドを使用してXQSビューを実行し、問合せとQueryParameterI配列(入力パラメータがない場合はnull)を渡します。executeView()を使用する場合は、そのビューのXQS関数の名前空間も渡します。

  4. ステートフルBeanの場合は、getNextItem()メソッドを繰返し使用して、項目ごとに結果を取得します。各項目は、XMLItemインスタンス内に戻されます。必要に応じてこれらの項目を処理します。

    ステートレスBeanの場合は、問合せ結果がベクターjava.util.Vectorとして完全にマテリアライズされ、XMLItemインスタンスが含まれます。必要に応じてこれらの項目のベクターを処理します。

  5. 問合せ内で使用したデータソースの構成にemptySequenceエラー・モードまたはerrorMessageエラー・モードを使用した場合は、必要に応じてgetErrors()メソッドを使用して、問合せの実行時にそのデータソース内で発生したエラーを取得できます。これにより、XQSErrorIオブジェクトのコレクションに対するイテレータが戻されます。エラーの構成と処理の詳細は、「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

  6. ステートフルBeanの場合は、close()メソッドを使用して、問合せに関連付けられているすべてのリソースを解放します。この手順は、ステートレスBeanには適用されません。

これらの手順は、次の例の中で示されています。「XQS EJBクライアントAPIリファレンス」も参照してください。

ステートフル・セッション用およびステートレス・セッション用のEJBクライアント

ステートフル・セッションとステートレス・セッションの使い分けの詳細は、「ステートフル・クライアントとステートレス・クライアント」を参照してください。

ステートフルEJBとステートレスEJBのどちらを取得するかは、JNDI検索および使用するXQSパッケージで決まります。次の例では、ステートフルBeanが取得されます。

//Look up and create the EJB to execute the query.
InitialContext ic = new InitialContext();
//Use Local client.
oracle.xqs.client.ejb.stateful.XQSClientLocalHome home =
   (oracle.xqs.client.ejb.stateful.XQSClientLocalHome)ic.lookup
                                        ("java:comp/env/XQSClientStatefulLocal");
oracle.xqs.client.ejb.stateful.XQSClientLocal bean = home.create();

次の例では、ステートレスBeanが取得されます。

//Look up and create the EJB to execute the query.
InitialContext ic = new InitialContext();
//Use Local client.
oracle.xqs.client.ejb.stateless.XQSClientLocalHome home =
   (oracle.xqs.client.ejb.stateless.XQSClientLocalHome)ic.lookup
                                        ("java:comp/env/XQSClientStatelessLocal");
oracle.xqs.client.ejb.stateless.XQSClientLocal bean = home.create();

前述のように、ステートレスEJBセッションで問合せ(非定型またはビュー)を実行すると、XMLItemインスタンスを含むベクターとして、結果が完全にマテリアライズされます。また、このベクターは、必要に応じて後で処理します。ステートフル・セッションの場合は、問合せの実行後に、getNextItem()メソッドを使用して項目を1つずつ取得します。これにより、タイプXMLItemの項目が戻されます。

ステートフル・セッションでのEJBクライアントAPIの使用

XQS EJBステートフル・クライアントAPIは、XQSFacadeI APIと同じです。前の項で示したBean作成用のコード以外にも、ステートフルEJBクライアントのコード例は、「例2: XQSFacadeI APIを使用した非定型問合せ」および「例3: XQSFacadeI APIを使用したXQSビュー」で示したXQSFacadeIの例と類似します。getNextItem()メソッドを繰返し使用して、項目を1つずつ、XMLItemインスタンスとして取得し、処理します。

制限事項

ステートフルEJBと関連付けられているXQSの問合せ状態は、非アクティブ化および後続の再アクティブ化では維持されません。問合せ状態は、execute()またはexecuteView()メソッドの起動後に確立されます。問合せ状態には問合せの実行計画を管理する内部構造が含まれ、項目の取得後には、結果順序の現在の項目の位置も含まれます。ステートフルBeanインタフェースを使用すると、毎回サーバー・セッションに接続することで、結果項目を一度に1つずつフェッチできます。

このオプションは、各項目のサイズまたは結果順序の合計サイズが大きすぎて、一度のラウンドトリップでは送信できない場合に重要です。また、最初の項目をすぐに戻すことによる迅速なレスポンスが必要な場合にも便利です。このオプションのデメリットは、サーバーによってBeanが非アクティブ化され、処理中の問合せの状態が失われる可能性があることです。

問合せ状態が失われ、クライアントにより後続のgetNextItem()のコールが試行されると、XQSによりエラー・コードがXQS 0088のXQSExceptionがスローされます。この制限を緩和する方法の1つは、キャッシュ済のXQSビューとしてステートフルBeanに起動される問合せを構成することです。キャッシュ済のXQSビューを使用すると、getNextItem()のコールを複数回実行して結果順序の目的の位置まで移動することにより、問合せを即座に再実行し、中断する前に現在の位置であった場所からフェッチを再開できます。

例: ステートレス・セッションでEJBクライアントAPIを使用したXQSビュー

このステートレスEJBの例では、「例3: XQSFacadeI APIを使用したXQSビュー」で使用したBasicFileWS XQSビューを再利用しており、そのコードの一部が繰り返されています。ビューとその構成は、この項を参照してください。

JNDI参照およびステートレスBeanの作成に加えて、このステートレスEJBの例とXQSFacadeIの例の重要な違いは、結果の処理にあります。ステートレス・セッションの結果は、XMLItemインスタンスを含むベクターとして完全にマテリアライズされます。XMLItemインスタンスを取得するためのgetNextItem()メソッドがBean内にあるのとは対照的に、その後、そこから項目を1つずつ取得し、XMLItemとしてキャストします。ただし、処理の基本的な性質は変わりません。

...
//lookup and create the EJB to execute the xquery
InitialContext ic = new InitialContext();

oracle.xqs.client.ejb.stateless.XQSClientLocalHome home =
                 (oracle.xqs.client.ejb.stateless.XQSClientLocalHome)
                 ic.lookup("java:comp/env/XQSClientStatelessLocal");
oracle.xqs.client.ejb.stateless.XQSClientLocal bean = home.create();

String xqueryView = "BasicFileWS";
QueryParameterI param = XQSFactory.getQueryParameter("custName");
param.setString("John Ford");
QueryParameterI[] params = new QueryParameterI[1];
params[0] = param;

java.util.Vector  result =
     bean.executeView(xqueryView,"http://xmlns.oracle.com/ias/xqs",params);

java.util.Enumeration resultEnum = result.elements();
while(resultEnum!=null && resultEnum.hasMoreElements()) {
    XMLItem item = (XMLItem)resultEnum.nextElement();
    if(item.instanceOfType(XMLItem.XMLITEM_STRING)) {
       resultBuf.append(item.getString());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_INT)) {
       resultBuf.append(item.getInt());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_LONG)) {
       resultBuf.append(item.getInt());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_INTEGER)) {
       if(item.intFormat())
           resultBuf.append(item.getInt());
       else
           resultBuf.append(item.getDecimal().intValue());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_BOOLEAN)) {
       resultBuf.append(item.getBoolean());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_FLOAT)) {
       resultBuf.append((float)item.getDouble());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_DOUBLE)) {
       resultBuf.append(item.getDouble());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_XDT_DAYTIMEDURATION)) {
       resultBuf.append(item.getDayTimeDuration());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_YEARMONTHDURATION)) {
       resultBuf.append(item.getYearMonthDuration());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_DURATION)) {
       resultBuf.append(item.getLexicalValue());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_DATETIME)) {
       resultBuf.append(item.getCalendar().getTime());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_ANYURI)) {
       resultBuf.append(item.getString());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_DECIMAL)) {
       resultBuf.append(item.getDecimal().intValue());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_NODE)) {
       resultBuf.append(item.getNode().getNodeName());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_HEXBINARY)) {
       resultBuf.append(item.getString());
    }
    else if(item.instanceOfType(XMLItem.XMLITEM_BASE64BINARY)) {
       resultBuf.append(item.getString());
    }
// Here is where you might use a bean.getErrors() call and process errors.
// (Assuming appropriate configuration.)
}
...

JSPタグ・ライブラリの使用方法

「XQSクライアントAPIを使用するための一般的なコーディング手順」を参照してください。XQS JSPタグ・ライブラリの場合は、(問合せの作成後に)ステートフル・アクセス・モードとステートレス・アクセス・モードのどちらを選択するかによって、次に示すように手順の詳細が異なります。

  1. taglibを介して、TLD URIおよび目的の接頭辞を指定してXQS JSPタグ・ライブラリをインポートします。

  2. executeCursorタグを使用してステートフル・モードで問合せを実行するか、executeタグを使用してステートレス・モードで問合せを実行します。executeCursorタグまたはexecuteタグで次の処理を行います。

    • xqueryString属性を使用して非定型問合せを指定するか、xqsViewName属性およびnamespace属性を使用してXQSビューを指定します。

    • 問合せ結果の出力変数を定義します。出力先は、XML文書(toXMLDoc属性を使用)、および結果のjava.util.ArrayListインスタンス(resultItems属性を使用)です。必要に応じて、JSP出力ストリーム(toWriter属性を使用)に出力することもできます。結果は、表8-2「バインド・パラメータ用にXQSでサポートされている型」に従って、Javaオブジェクト型で表されます。

    • 問合せ内で使用したデータソースの構成にemptySequenceエラー・モードまたはerrorMessageエラー・モードを使用した場合は、必要に応じてerrors属性を使用し、問合せの実行時にこれらのデータソース内で発生したエラーを処理できます。これにより、XQSErrorIオブジェクトのコレクションに対するイテレータが戻されます。エラーの構成と処理の詳細は、「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

  3. executeCursorタグまたはexecuteタグでは、各入力パラメータに対してparamサブタグを使用します。必要に応じて、paramタグのlocalNamenamespacevalueおよびtypeの各属性を使用します。

  4. executeCursorタグの場合は、関連するnextタグを使用して結果を項目ごとに取得するか、結果をバッチで取得して出力媒体に送ります。

    executeタグの場合は、結果が完全にマテリアライズされて、出力媒体に送られます。

  5. 1つ以上の出力媒体で繰返し処理を行い、結果を処理します。使用できる出力媒体(JSP出力ストリーム、XML文書、Javaのリスト)は標準であるため、これはXQS固有の手順ではありません。nextを1回実行するたびに、その結果を処理する必要があることに注意してください。処理せずに再びnextを実行すると、結果が上書きされます。

  6. executeCursorタグの場合は、closeタグを使用して、問合せに関連付けられているすべてのリソースを解放します。この手順は、executeタグには適用されません。

これらの手順は、次の例の中で示されています。「XQS JSPタグ・ライブラリのリファレンス」も参照してください。


注意:

必要に応じて、JSPページでJSTLタグを使用して結果を変換することもできます。

ステートフル・アクセス用およびステートレス・アクセス用のJSPタグ

ステートフル・アクセスとステートレス・アクセスの使い分けの詳細は、「ステートフル・クライアントとステートレス・クライアント」を参照してください。

XQSを使用するJSPページでは、ステートフル・アクセスとステートレス・アクセスのどちらを使用するかは、使用するタグによって決まります。executeCursorタグの場合はステートフル・アクセスを使用しますが、executeタグの場合はステートレス・アクセスを使用します。

前述のように、問合せ(非定型またはビュー)をステートレスJSPアクセス・パターンで実行すると、結果が完全にマテリアライズされて、属性の設定(XML DOMドキュメント、Object[]配列、およびオプションのJSP出力ストリーム)を介して選択した出力媒体に送られます。その後、これらの結果を必要に応じて処理します。ステートフル・アクセス・パターンの場合は、問合せの実行後に、nextタグを使用して、1つずつ項目を取得して処理します。

例: ステートフル・アクセス・パターンでJSPタグを使用したXQSビュー

このステートフルJSPの例では、「例3: XQSFacadeI APIを使用したXQSビュー」BasicFileWS XQSビューを再利用しています。ビューとその構成は、この項を参照してください。

この項のコード例では、次のことが実行されます。

  • pageディレクティブによって、要求されたクラスがインポートされます。

  • taglibディレクティブによって、タグ・ライブラリのTLD URIおよび使用するタグ接頭辞が指定されます。

  • executeCursorタグによってビューが実行され、オープン・カーソルがフェッチ可能な状態になります。namespace属性によって、基礎となるXQSView関数が定義される名前空間が指定されます。

  • executeCursorparamサブタグによって、入力パラメータ(顧客名)が指定されます。

  • cursorIdの設定を介してexecuteCursorタグに関連付けられているnextタグにより、結果ごとに処理が繰り返され、出力媒体(XML文書および結果項目のArrayListインスタンス)が移入されます。その際には、処理対象のデータが残っているかどうかを調べるために、繰返し処理のたびにitemsFetched属性が使用されます。nextタグは、executeCursorタグで指定されたカーソルID(mycursor)を参照する必要があります。

  • closeタグにより、カーソルがクローズされ、関連付けられているリソースが解放されます。このタグも、executeCursorタグで指定されたカーソルID(mycursor)を参照する必要があります。


注意:

  • ここでは、エラー処理について言及しません。適切なエラー構成(データソース構成のemptySequenceモードまたはerrorMessageモード)を使用していれば、myerrorsイテレータを処理できます。「XQSエラー処理モードおよびAPIの使用方法」を参照してください。

  • ここでは、出力媒体の処理について言及しません。XML文書または結果オブジェクトの配列の処理に関しては、XQS固有の処理はありません。


<%@ page import="oracle.xml.parser.v2.XMLElement" %>
<%@ page import="oracle.xml.parser.v2.XMLDocument" %>

<%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/xquerytag.tld"
           prefix="xq"%>
<%
String xqueryView = "BasicFileWS";
int items;
%>
<xq:executeCursor
                xqsViewName="<%=xqueryView%>"
                namespace="http://xmlns.oracle.com/ias/xqs"
                resultItems="myresults"
                toXMLDoc="mydoc"
                cursorId="mycursor"
                errors="myerrors" >
   <xq:param
              localName="custName"
              value="John Ford"
              type="String"/>
</xq:executeCursor>
<%
do{
// Populate the XML document and result items array.
%>
   <xq:next
                cursorId="mycursor"
                itemsFetched="fetched" />
<%
  items=fetched.intValue();
 }while(items>0)
// Here is where you might process the "myerrors" error iterator.
// (Assuming appropriate configuration.)

// Retrieve results from the XML document mydoc and the result items array myresults.
// (This processing is not XQS-specific.)
%>
<xq:close cursorId="mycursor" />

例: ステートレス・アクセス・パターンでJSPタグを使用した非定型問合せ

この例では、XQS JSP executeタグを使用して非定型問合せが実行され、ステートレス・アクセス・パターンが使用されます。この例の主な目的は、前述のステートフル・アクセスの使用例と比較することで、次の事項を比較および対比させることにあります。

  • ビューではなく非定型問合せを使用します。関連する構成で同じ問合せを使用している、「例2: XQSFacadeI APIを使用した非定型問合せ」を参照してください。問合せは1つの文字列バッファに統合され、その後、バッファから文字列に書き込まれます。

  • ステートフル・アクセスではexecuteCursorタグを使用しますが、ステートレス・アクセスでは、かわりにexecuteタグを使用します。executeタグにnextサブタグが使用されていないため、closeタグは不要です。

<%@ page import="oracle.xml.xqxp.datamodel.XMLItem" %>
<%@ page import="oracle.xml.parser.v2.XMLElement" %>
<%@ page import="oracle.xml.parser.v2.XMLDocument" %>

<%@ taglib uri="http://xmlns.oracle.com/j2ee/jsp/tld/ojsp/xquerytag.tld"
           prefix="xq"%>
<%
StringBuffer xqueryBuf = new StringBuffer();
xqueryBuf.append("declare namespace xqs=\"http://xmlns.oracle.com/ias/xqs\";\n");
xqueryBuf.append("declare function xqs:get_poSQ($bind as xs:string) external;\n");
xqueryBuf.append("for $po in xqs:get_poSQ(\"http://localhost:8888/myrepository/pos-2KB.xml\") \n");
xqueryBuf.append("return $po\n");

String xqueryStr = xqueryBuf.toString();
%>
<xq:execute
                xqueryString="<%=xqueryStr%>"
                toXMLDoc="mydoc"
                resultItems="myresults"
                errors="myerrors" />
<%
// Here is where you might process the "myerrors" error iterator.
// (Assuming appropriate configuration.)
%>
<%
// Retrieve the results from either the XML document mydoc or result items array
// myresults. (This processing is not XQS-specific.)
%>

Webサービス操作として公開されたXQSビューの使用方法

XQSでは、自動生成されたサーブレットを介して実装されたWebサービスを使用して、XQSビューをWebサービス操作として公開できます。詳細および関連情報は、「XQSビューをWebサービス操作として公開するためのOC4JPackagerの追加の出力」を参照してください。

Webサービス・クライアントは、独自に提供する必要があります。

OC4JPackagerを使用したXQSアプリケーションのパッケージ方法

この項では、OC4JPackagerを使用してXQS関連ファイルをアプリケーションにバンドルする方法について説明します。概要は、「OC4JPackagerの概要」を参照してください。

OC4JPackagerでは、他のEARのようにOC4Jにデプロイできる、EARファイルが作成されます。一般情報は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

この項には、次の項目が含まれます。

OC4JPackagerの使用手順

この項では、J2EEアプリケーションでOC4JPackagerを実行し、XQS機能を使用できるようにするための基本的な準備および実行の手順を示します。ここに出てくるOC4JPackagerのパラメータおよびJavaのプロパティに関する一般情報は、「OC4JPackagerのリファレンス」を参照してください。


注意:

OC4JPackagerでは、ディレクトリ名またはファイル名でのスペースの使用はサポートされていません。

OC4JPackagerを実行するための準備

OC4JPackagerを実行するには、次の準備手順を完了してください。

  1. 通常どおりに、アプリケーション・コンポーネントのJARファイル(Webモジュール用WARファイル、EJBモジュール用EJB JARファイルなど)を作成します。その際、すべてのファイルに、適切な標準J2EE構成ファイル(web.xmlおよびejb-jar.xmlなど)を使用します。その後、必要に応じてこれらのファイルをOC4JPackagerのEARファイルにバンドルするか、他の関連ファイル(application.xmlなど)とともに、EARファイルの構造と内容を反映するディレクトリ構造に置いておきます。

  2. アプリケーションの目的のディレクトリを選択し、(必要に応じて)EARファイルまたは構造化されたEARの内容をそのディレクトリに配置します。

    -appArchivesパラメータ(必須)を介して、OC4JPackagerにそのディレクトリを指定します。

  3. すべてのXQSビュー(.xqまたは.sql)ファイルが配置されるXQSリポジトリとして目的のディレクトリを選択し、XQSビュー(.xqまたは.sql)ファイルをそこに配置します。

    -repositoryパラメータを介して、OC4JPackagerにそのディレクトリを指定します。

  4. xqs-config.xmlファイルの目的のディレクトリを選択し、ファイルをそのディレクトリに配置します。ただし、XQS構成が完了していることが前提条件になります(「XQS関数の構成方法」を参照)。

    -xqsConfigパラメータ(必須)を介して、OC4JPackagerにそのディレクトリを指定します。

OC4JPackagerの実行: 必須およびオプションのパラメータとプロパティ

OC4JPackagerの実行時には、必要に応じて次を指定します。例は、次の「コマンドラインでのOC4JPackagerの実行」の項を参照してください。

プログラム・パラメータ

  1. 必須の-appArchivesパラメータを使用して、アプリケーションが配置されている場所(EARファイルの場所、つまりEAR構造のトップレベル・ディレクトリ)を指定します。

  2. オプションの-repositoryパラメータを使用して、XQSリポジトリのディレクトリを指定します。

  3. 必須の-xqsConfigパラメータを使用して、アプリケーションのxqs-config.xmlファイルへのフルパス(ファイル名を含む)を指定します。

  4. 必須の-nameパラメータおよび-outputパラメータを使用して、OC4JPackagerによって作成されるEARファイルの名前と出力ディレクトリを指定します。

  5. アプリケーションによって使用されるXQS機能用ファイルがOC4JPackagerに含まれるように、またはファイルが除外されるように、該当するフラグを使用して指定します。

    • XQS JSPタグ・ライブラリを使用する場合は、-jspフラグを使用します。

    • XQSステートフルEJBクライアントAPIを使用する場合は、-sfフラグを使用します。

    • XQSステートレスEJBクライアントAPIを使用する場合は、-slフラグを使用します。

    • OC4JPackagerがWebサービスを生成しないようにする場合は、-no_wsフラグを使用します。

    XQSFacadeIインタフェースは常に含まれます。)

Java VMプロパティ

  1. 必須のJavaプロパティjava.homeを使用して、Javaのホーム・ディレクトリを指定します。OC4JPackagerによって、このディレクトリから、タスクに必要なjavaコマンドが実行されます。

  2. OC4JPackagerに(必要に応じてEARファイルのバンドル解除およびバンドルを行う)特定の作業ディレクトリを使用させる場合は、オプションのJavaプロパティxds.packager.work.dirを使用します。デフォルトは、user.home Javaプロパティで指定されたディレクトリです。

  3. オプションのJavaプロパティjava.util.logging.properties.fileを使用して、Javaのロギング設定(OC4JPackagerのロギング・レベルを含む)を指定するロギング・プロパティ・ファイルを指定します。ロギング・プロパティは、次の場所で説明されているように、標準のJ2SEロギングによって定義されます。

    http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/
    
  4. Oracleホーム・ディレクトリを示す場合は、オプションのJavaプロパティoracle.homeを使用します。この処理は、OC4JPackagerフラグ-jsp-sf-sl「OC4JPackagerのパラメータ」を参照)、および関連するJARファイルを使用する場合には必須です。

コマンドラインでのOC4JPackagerの実行

OC4JPackagerは、OC4JPackager.jarを起動するjavaコマンド(コマンド・プロンプトは%)を使用して、コマンドラインから実行できます。

% java -jar OC4JPackager.jar ...

OC4JPackager.jarは、XQS配布のxds/toolsディレクトリにあり、OC4Jコンテナ内のインストール場所から使用する必要があります。

次に例を示します($ORACLE_HOMEはOracleインストールのホーム・ディレクトリとして設定されており、\は行折返しを示します)。この例は、XQS JSPタグ・ライブラリおよびステートフルEJBクライアントAPIを使用するアプリケーション用です。現在のディレクトリからの相対パス、または絶対パスを指定できます。

% java -jar OC4JPackager.jar \
       -Djava.home=/home/myjavainstall \
       -Dxds.packager.work.dir=$ORACLE_HOME/temp \
       -Doracle.home=$ORACLE_HOME \
       -Djava.util.logging.properties.file=myfile.properties \
       -appArchives $ORACLE_HOME/myapp \
       -xqsConfig $ORACLE_HOME/xds/myconfig/xqs-config.xml \
       -repository $ORACLE_HOME/xds/repository \
       -output $ORACLE_HOME/xds/mystaging -name myxqsapp.ear \
       -jsp -sf

もしくは、次の項で説明するように、Antを介してOC4JPackagerを実行できます。

「OC4JPackagerの基本的な出力」も参照してください。

Antを介したOC4JPackagerの実行

前の項で説明したように、コマンドラインからOC4JPackagerを実行するかわりに、標準のAnt javaタスクを介して、Antを使用したビルド処理の一部としてOC4JPackagerを実行できます。Antの一般情報は、ApacheのWebサイトhttp://ant.apache.org/manual/を参照してください。(また、OC4J固有のAntタスクに関する情報は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。)

例として次に示すAntビルド・ファイルの一部では、OC4JPackagerが起動されます。この例は、前項で示した例のコマンドラインに対応しています。

<java jar="OC4JPackager.jar" fork="true" failonerror="true">
   <jvmarg value="-Doracle.home=${ORACLE_HOME}"/>
   <jvmarg value="-Djava.home=/home/myjavainstall"/>
   <jvmarg value="-Dxds.packager.work.dir=${ORACLE_HOME}/temp"/>
   <jvmarg value="-Djava.util.logging.properties.file=myfile.properties"/>
   <arg line="-appArchives ${ORACLE_HOME}/myapp"/>
   <arg line="-xqsConfig ${ORACLE_HOME}/xds/myconfig/xqs-config.xml"/>
   <arg line="-repository ${ORACLE_HOME}/xds/repository"/>
   <arg line="-output ${ORACLE_HOME}/xds/mystaging" />
   <arg line="-name myxqsapp.ear"/>
   <arg line="-jsp"/>
   <arg line="-sf"/>
</java>

重要:

上に示したように、OC4JPackagerパラメータを設定する<arg>要素では、value属性のかわりにline属性を使用します。

OC4JPackagerの基本的な出力

OC4JPackagerで作成されたEARファイルは標準的な構造を持ち、少なくとも1つの追加コンポーネントがあります。このコンポーネントはxqs-resources.jarという名前のファイルで、XQS構成ファイルおよびXQSリポジトリ・ファイル(XQSビューの.xqファイル)のディレクトリが含まれます。


注意:

Webサービス操作として公開するXQSビューが存在する場合は、EARファイルに追加のコンポーネントが含まれます。次の「XQSビューをWebサービス操作として公開するためのOC4JPackagerの追加の出力」の項を参照してください。

WebモジュールmywebappおよびEJBモジュールmyejbで構成されるアプリケーションでは、OC4JPackagerによって次のようなEARファイルの内容が作成されます。

META-INF/
   application.xml
   orion-application.xml
   data-sources.xml
mywebapp.war
myejb.jar
xqs-resources.jar

xqs-resources.jar以外にも、アプリケーションには、application.xmlファイル、必要に応じてオプションのorion-application.xmlファイルとdata-sources.xmlファイル、Webモジュール用WARファイル、EJBモジュール用EJB JARファイルなどがすでに含まれている必要があります。

xqs-resources.jarの構造は次のとおりです。

   APP-REPOSITORY/
      filename.xq
      filename.xq
      filename.xq
      ...
   xqs-config.xml
   xds-application.properties

ファイルxds-application.propertiesは、XQSによって内部的に使用されます。

XQSビューをWebサービス操作として公開するためのOC4JPackagerの追加の出力

XQS構成でWSDLvisibility="true"と設定されたXQSビュー(SQLベースのビューを除く)では、XQSによって、ビューがWebサービス操作として公開されます。いずれのWebサービスでも、操作を起動するWebサービス・クライアントが必要です。


注意:

WSDLvisibilityプロパティがtrueに設定された状態でXQSビューがWebサービス操作として公開されてしまうため、OC4JPackagerによってアプリケーションにWebサービス・モジュールが作成および追加されないようにする場合は、次のようにして、OC4JPackagerの実行時に-no_wsフラグを指定します。

% java -jar OC4JPackager.jar ... -no_ws

このフラグはオプションです。デフォルトでは、Webサービス・モジュールが追加されます。


OC4JPackagerによって、Webサービスの実装、および公開される各XQSビューの操作を定義するWSDLドキュメントが作成されます。その後、OC4JPackagerによって、次の内容を含むWARファイルが作成されます。

  • WSDLドキュメント

  • Webサービス・サーブレットを構成するためのWebモジュール構成ファイルweb.xml

  • Webサービス構成ファイルoracle-webservices.xml

また、OC4JPackagerによって、アプリケーションのapplication.xmlファイルが更新され、追加のWebモジュールのエントリが作成されます。

XQSビューWebサービスを表す追加のWebモジュールの名前、コンテキスト・ルートおよびWAEファイルは、アプリケーションの名前に対応します。アプリケーションmyappの場合は次のようになります。

  • /myapp-WS: Webサービス・モジュールのコンテキスト・ルート

  • myapp-WS-web.war

生成されたWSDLファイルは、常にxqsview-WS.wsdlになります。

Webサービスを表し、Oracle Webサービスのテスト・ページにつながるサーブレットのURLパターンは、常に/xqs-wsです。

つまり、XQSビューWebサービスのWSDLのURLは、http://host:port/myapp-WS/xqs-ws?WSDLとなります。


注意:

追加のWARファイルには、Webサービスのクライアント起動コードは含まれません。このコードは、サーバー上のアプリケーション・デプロイメントの一部になる予定です。

WSDLドキュメントでは、wsdl:operationの名前は、XQS構成(<xqsview-source><function-name>サブ要素)で定義された対応するXQS関数の名前と同じになります。各wsdl:inputメッセージ・タイプは、XQS構成(<xqsview-source><input-parameters>サブ要素)で定義された入力パラメータ・タイプに対応するXML型にマップされます。各wsdl:outputメッセージ・タイプは、XQS構成(<xqsview-source><output-element>サブ要素)で定義された出力要素に対応するXML要素または型にマップされます。これらは、stringintなどの単純型、またはユーザーが定義した複合型のどちらかになります。バインディングは、SOAPドキュメント/ラップ・バインディングになります。

次の例は、次のすべての項の内容を合せたものです。

例: Webサービス操作としてビューを公開するための構成

この章で前述した次の構成では、WSDLvisibility="true"の設定を介して、ビューBasicFileWSがWebサービス操作として公開されます。

<xqsview-source WSDLvisibility="true"  isCached="false">
   <function-name  prefix="xqs">BasicFileWS</function-name>
   <input-parameters type-match="none" >
      <part position="1" name="custName">
         <schema-type prefix="xs">string</schema-type>
      </part>
   </input-parameters>
   <output-element namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
                location="http://host:port/xqsdemos/MyTypes.xsd" type=CustomerOrdersType>customerOrders </output-element>
</xqsview-source>

後述の説明は、この例がmyappというアプリケーションの一部であることを前提としています。

例: Webサービス操作として公開されるビューのEARファイル

アプリケーションmyappmywebapp.warおよびmyejb.jarで構成されており、1つ以上のXQSビューがWebサービス操作として公開されると仮定します。OC4JPackager実行後のアプリケーションEARファイルの関連する内容は、次のようになります。

META-INF/
   application.xml
mywebapp.war
myejb.jar
myapp-WS-web.war
xqs-resources.jar

WARファイルmyapp-WS-web.warは、公開されるビューのWebサービス操作の自動作成済サーブレット実装用です。この内容は、次の項を参照してください。

例: Webサービス操作として公開されるビューのWARファイル

公開されるビューのWebサービス操作のサーブレット実装用に作成されたmyapp-WS-web.warの内容は、次のとおりです。

WEB-INF/
   web.xml
   oracle-webservices.xml
   wsdl/
      xqsview-WS.wsdl

特に、WSDLドキュメントに注意してください。WSDLの部分的な例は、次の「例: Webサービス操作として公開されるビューのWSDLドキュメント」の項を参照してください。

例: Webサービス操作として公開されるビューのWSDLドキュメント

この項では、Webサービスとして公開されるXQSビュー用のOC4JPackagerによって生成されるWSDLドキュメントの一部を示します。この例では、BasicFileWSという名前のビューに関連する部分を示します。

...
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xqscwsNsPref="xqs-client-ws"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xqs0="http://xmlns.oracle.com/ias/xqs" xmlns:tns="xqs-
    client-ws_myapp-WS" name="myapp-WS" targetNamespace="xqs-
    client-ws_myapp-WS">
<types>
...
<schema targetNamespace="http://xmlns.oracle.com/ias/xqs"
xmlns:xqs1="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
xmlns:tns="http://xmlns.oracle.com/ias/xqs"
...
>
<import namespace="xqs-client-ws"/>
<import namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
schemaLocation="http://host:port/xqsdemos/MyTypes.xsd"/>

<complexType name="BasicFileWSType">
      <sequence>
          <element name="custName" type="string"
              nillable="true" />
      </sequence>
   </complexType>
   <complexType name="BasicFileWSResultType">
       <sequence>
         <element name="return" nillable="true">
           <complexType>
             <sequence>
               <element name="result" nillable="true">
                 <complexType>
                   <sequence>
                     <element name="customerOrders"
                        type="xqs1:CustomerOrdersType"
                        minOccurs="0" maxOccurs="unbounded" />
                  </sequence>
                 </complexType>
               </element>
             <element name="errors" nillable="true" minOccurs="0">
               <complexType>
                 <sequence>
                    <element name="xqserror"
                      type="xqscwsNsPref:XQSErrorType"
                      maxOccurs="unbounded" />
                  </sequence>
                </complexType>
              </element>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
<element name="BasicFileWS" type="tns:BasicFileWSType" />
<element name="BasicFileWSResult" type="tns:BasicFileWSResultType" />

…
</schema>
…
</types>
…
<message name="BasicFileWSRequest">
 <part name="parameters" element="xqs0:BasicFileWS" />
</message>
<message name="BasicFileWSResponse">
 <part name="return" element="xqs0:BasicFileWSResult" />
</message>
…
<portType name="XQSViewWebServices">
   <operation name="BasicFileWS">
      <input message="tns:BasicFileWSRequest" />
      <output message="tns:BasicFileWSResponse" />
    </operation>
    …
    </portType>
      <binding name="HttpSoap11Binding"  type="tns:XQSViewWebServices">
          <soap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <operation name="BasicFileWS">
           <soap:operation />
          <input>
              <soap:body use="literal" parts="parameters" />
           </input>
          <output>
              <soap:body use="literal" parts="return" />
           </output>
         </operation>
         …
    </binding>
   <service name="XQSView-WS">
       <port name="HttpSoap11" binding="tns:HttpSoap11Binding">
           <soap:address xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             location="http://host:port/myapp-WS/xqs-ws" />
       </port>
   </service>
</definitions>

XQSパフォーマンス機能の使用方法

この項では、XQSで提供されるパフォーマンス機能について説明します。この章には、次の項目が含まれます。

ステートレスまたはステートフルのXQSクライアントAPIを使用する際のパフォーマンスの考慮事項

前述のように、XQSクライアントAPIでは、結果が完全にマテリアライズされてプロセス・メモリーに格納されるステートレス問合せの実行、またはカーソルを介して結果が段階的にアクセスされるステートフル問合せの実行を選択できます。どちらの方法にも、長所と短所があります。

ほとんどの状況では、ステートレス実行が適しています。これは、評価が完了した直後に、関連付けられているリソースが解放されるためです。ただし、結果順序に含まれる項目の全体のサイズが大きすぎて、順序全体を一度にマテリアライズするとプロセス・メモリーが不足する場合には、ステートレス実行を使用できません。このような場合は、問合せが結果を項目ごとに提供するのを妨げるもの(たとえば集計式など)がないかぎり、カーソル・モードが唯一の手段になります。

追加情報は、「ステートフル・クライアントとステートレス・クライアント」を参照してください。

XQSキャッシングの構成

この項では、XQS使用時のキャッシュの構成方法を詳しく説明し、関連する考慮事項を示します。


重要:

XQS実装では、OC4J Java Object Cacheを使用してキャッシングが行われます。Java Object Cacheが実行中で(また、必要に応じて自動的に起動され)、その構成ファイルORACLE_HOME/j2ee/home/config/javacache.xmlが存在する必要があります。通常は、このファイル・ディレクトリを更新する必要はありませんが、更新してもかまいません。第7章「Java Object Cache」を参照してください。

Java Object Cacheのすべての構成は、XQSアプリケーションだけでなく、OC4Jインスタンス全体に適用されることに注意してください。


XQSキャッシュ設定

XQSキャッシングは、XQS関数ごとに(本質的には、アクセスするデータソースごとに)個別に構成されます。特定のXQS関数に対してキャッシングを使用するには、次の手順を行います。

検討が必要な対策は、次の「XQSキャッシングの対策」の項を参照してください。すべての要素と属性に関する完全な説明は、「XQS構成ファイルのリファレンス」を参照してください。

  1. <document-source>要素、<xqsview-source>要素または<wsdl-source>要素のisCached属性を介して、キャッシングを有効化します。例:

    <document-source isCached="true">
       ...
    </document-source>
    

    重要:

    isCachedの値がfalse(デフォルト)に設定されている場合は、XQS関数のその他のキャッシュ設定がすべて無視されます。

  2. <document-source>要素、<xqsview-source>要素または<wsdl-source>要素の<cache-properties>サブ要素を使用します。time-to-live属性には、キャッシュ・エントリの期限が切れるまでの保持時間(秒単位)を決定する整数値が使用されます。例:

       <cache-properties time-to-live="600">
          ...
       </cache-properties>
    
  3. <cache-properties><in-memory>サブ要素を使用し、useSpool属性およびuseDiskCache属性を介して、使用するキャッシュ・モードを指定します。単純なメモリーベースのキャッシングの場合は、useSpooluseDiskCacheの両方をfalseに設定します。メモリー不足になると必要に応じてキャッシュ・データをディスクにスプールできるメモリーベースのキャッシングの場合は、useSpooltrueに設定し、useDiskCachefalseに設定します。ディスクベースのキャッシングの場合は、useDiskCachetrueに設定し、useSpoolfalseに設定します。(関連する考慮事項は、次の「XQSキャッシングの対策」の項を参照してください。)次の例では、必要に応じてスプーリングを使用する、メモリーベースのキャッシングが使用されています。

          <in-memory useSpool="true" useDiskCache="false"/>
    

次に、完全なキャッシュ構成の例を示します。

<document-source isCached="true">
   ...
   <cache-properties time-to-live="600">
      <in-memory useSpool="true" useDiskCache="false"/>
   </cache-properties>
   ...
</document-source>

XQSキャッシングの対策

XQSキャッシングに関して、次の考慮事項に注意してください。

  • 時間、アクセスのコスト、アプリケーション・オーバーヘッドなど、なんらかの形でデータにコストがかかっている場合には、ソースをキャッシュすることをお薦めします。キャッシングがOC4Jインスタンスのシステム・メモリーに与える影響も考慮する必要がありますが、メモリーへの影響は、ディスクベースのキャッシング、またはスプーリングを伴うメモリーベースのキャッシングを使用することで軽減できます。(後続の項を参照してください。)

  • 問合せ結果をキャッシュするために、問合せをXQSビューとして定義します。ビューは、ある種のXQSソースであり、キャッシュ可能です(つまり、その結果もキャッシュされます)。

  • キャッシュ・オブジェクトの有効期限、つまりTTLは、ユーザーが判断します。データの性質および有益な期間に基づいて、データが期限切れになるまでのキャッシュ期間を決定します。

  • <in-memory>設定の定義では、単純なメモリーベースのキャッシング(useSpool="false"およびuseDiskCache="false")、メモリー不足により必要になった場合にディスクにスプールできるメモリーベースのキャッシング(useSpool="true"およびuseDiskCache="false")、ディスクベースのキャッシング(useSpool="false"およびuseDiskCache="true")のどれを使用するかを考慮します。追加情報は、「<in-memory>」を参照してください。注意事項は次のとおりです。

    • 単純なメモリーベースのキャッシングでは、パフォーマンスが最も速くなりますが、メモリー不足またはサーバーでの障害の発生により、キャッシュ・データが失われる危険性も最も高くなります。

    • スプーリングを伴うメモリーベースのキャッシングでは、(メモリーの問題によりキャッシュ・データが常にスプールされないかぎり)ディスクベースのキャッシングよりパフォーマンスが速くなりますが、サーバーで障害が発生した場合にキャッシュ・データが失われる危険性があります。

    • ディスクベースのキャッシングでは、パフォーマンスは最も遅くなりますが、キャッシュ・データの安全性は最も高くなります。メモリーを考慮する必要がなく、サーバーで障害が発生してもキャッシュ・データはリカバリされます。

    キャッシュ・データの危険度と実行速度の重要度を比較検討します。

キャッシングと非決定的な結果

「要件、制限事項および特記事項」で説明しているXQS関数とノードIDの問題は、一部の例外的または特殊な状況で発生し、キャッシングを使用しているかどうかによって、問合せ結果が異なる場合があることに注意してください。ただし、ほとんどの問合せが(ノードではなく)値が等しいことに依存するため、通常はこの問題は発生しません。

ラージ・データ用のXQSドキュメント・ソースの構成

システム容量や一般的なメモリー節約オプションの使用に関係なく、データセットが大きいためにメモリーによる制限を受ける場合があります。この問題を解決するには、背後で作業単位方式を使用します。この方法では、取得されるデータの合計量に関係なく、一定量のメモリーが使用されます。XQSは、Oracle XDK内の依存するテクノロジおよび中間層のXQueryと連携しているため、XQSの実行中は常に、このスケーラブルな解決方法が提供されます。

ただし、この作業単位方式でも解決できないほどデータセットが大きい場合もあります。ドキュメント・ソースについてこのような状況が発生した場合は、データソースによって大量のメモリー・リソースが消費されるため、メモリー節約の内部最適化オプションを使用するように、XQSに指示することができます。次の例のように、<document-source>要素の属性であるlargeDataフラグを使用します。

<document-source largeData="true">
   ...
</document-source>

サイズの大きいドキュメント・ソースをメモリーにロードできないときは、このフラグを有効化することで可能になる場合があります。


重要:

  • largeDataフラグはXQSビューおよびWSDLソースには適用されません。

  • largeData="true"を使用すると、処理速度が低下します。この設定は、必要な場合のみ使用してください。このような理由から、デフォルト値はfalseに設定されています。


XQSエラー処理モードおよびAPIの使用方法

「XQSエラー処理の概要」で示したように、XQS関数を構成して、(データソースを使用できない、またはデータ変換の問題などの)エラーが発生しても処理を続行することができます。処理を続行するようにXQS関数を構成した場合は、後でoracle.xqs.client.XQSErrorIオブジェクトのイテレータとして戻されるエラーを取得し、エラーの情報を入手できます。

XQSでは、XQS関数内部のエラーにのみ、特別な処理が適用されます。構文エラーやタイプの不一致などの通常のXQueryエラーの場合は、いずれのXQSエラー・モードでも、問合せの実行が停止します。

XQSエラー・モードは、XQS関数ごとに個別に構成します。1つの関数のエラー・モードが、同じ問合せ内の他のXQS関数の動作に影響することはありません。

次の各項では、処理を続行してエラー情報を戻すためのXQS関数の構成方法、およびエラー情報の取得に使用できるメソッドについて説明します。

XQS関数のエラー処理の構成

xqs-config.xmlで構成する各データソースについて、ソース要素<document-source><xqsview-source>または<wsdl-source>onError属性を介して、XQSのエラー処理を指定できます。サポートされている設定は次のとおりです。

  • dynamicError(デフォルト): この設定では、XQS関数の評価時に問題が発生すると、XQuery動的エラーが発生し、問合せが停止します。このような状況ではエラー・オブジェクトは戻されず、例外メッセージ以外の情報を取得できません。

  • emptySequence: この設定では、XQS関数によって生成されたエラーが発生しても、空のXML順序が関数の結果として戻され、問合せの実行は続行されます。次の各項で示すように、エラー・オブジェクトを取得して、そのオブジェクトから情報を入手できます。

  • errorMessage: この設定では、XQS関数によって生成されたエラーが発生すると、関数の結果に対して単一項目のXML順序が戻されます。順序内の項目はエラー・メッセージを表します。このメッセージは、事前構成済のメッセージまたはデータソースが戻すなんらかのメッセージで、構成によって異なります。また、次の各項で示すように、エラー・オブジェクトを取得して、そのオブジェクトから情報を入手できます。

特定のデータソースに対するXQSエラー処理の構成手順は、場合によって2つになります。

  1. <document-source>要素、<xqsview-source>要素または<wsdl-source>要素のonError属性の設定を指定します。

  2. errorMessageモードを使用する場合は、必要に応じて<document-source><xqsview-source>または<wsdl-source><error-message>サブ要素を使用します。これにより、問合せ結果に対して戻される単一項目のXML順序に、XQSのエラー・メッセージが含まれるように、エラー・メッセージが事前構成されます。

次に、emptySequenceモードを使用するソースの例を示します。

<document-source onError="emptySequence">
   ...
</document-source>

次に、事前構成済のメッセージを使用するerrorMessageモードの使用例を示します。

<wsdl-source onError="errorMessage">
   ...
   <error-message>No information available</error-message>
   ...
</wsdl-source>

errorMessageモードの場合、事前構成済のメッセージを指定しないと(つまり、<error-message>要素を使用しないと)、データソースによって戻されたメッセージがそのままXQSによって使用され、そのメッセージが、関数の結果として戻された単一項目のXML順序に含められます。データソースのエラー・レポート機能が不十分な場合には、意味のあるエラー・メッセージを取得することが不可能になることがあります。この場合は、事前構成済のメッセージが指定されていないと、エラー・メッセージが空の状態で戻されます。

戻される順序に含まれる単一項目のタイプは、xs:stringまたはxs:nodeのどちらかになります。

  • 項目が文字列の場合、その文字列は単純に、事前定義されたか実際に発生したエラーから取得されたエラー・メッセージです。

  • 項目がXMLノードの場合、その項目はxqserrorで、そのテキスト値がエラー・メッセージになります。また、エラー・ノードには、functionNametypeおよびcodeという3つの属性があります。XQSエラー・ノードは次のようになります。

<xqserror functionName="XQS function name" type="XQSERR_XXX" code="XQS 0NNN" >
   error message
</xqsrror>

XQSにより、関数のタイプ情報に基づいて、そのエラー項目により適したタイプが選択されます。

  • XQS関数がドキュメント関数の場合、エラー項目のタイプはxs:nodeになります。これは、ドキュメント関数が常にXMLノードを戻すことになっているためです。

  • XQS関数が<output-element>を使用して構成されており、タイプ名または要素名がプリミティブXML Schemaタイプでない場合、この関数はXQSによってXML要素タイプであるとみなされ、エラー項目がXMLノードとして作成されます。

  • xs:stringではないにもかかわらず)<output-element>によってプリミティブXML Schemaタイプが指定されている場合、または<output-element>が指定されていない場合は、XQSによって、エラー項目が文字列として作成されます。

注意事項および考慮事項

  • errorMessageエラー・モードを使用してXQS関数を構成し、<output-element>を指定しない場合、または<output-type>を指定したがユーザーが定義した複合型もしくはxs:stringでない場合は、その関数を使用する問合せのXQueryプロローグでその関数の戻り型を指定しないでください。外部XQuery関数の戻り型の宣言は、オプションです。前述の状況で戻り型を指定すると、実行時に、この戻り型がXQueryによって強制的に使用されます。XQS関数の実行時にエラーが発生すると、XQSによって、エラー・メッセージが文字列として戻されます。これが、問合せのプロローグで宣言された戻り型と競合します。戻り型を宣言しない場合は、強制的な型の一致は実行されません。

  • XQSビューでその他のXQS関数およびソースが使用される状況では、ビューのエラー処理構成と基礎となる関数のエラー処理構成は関連性を持ちます。基礎となる関数の構成により、エラー発生時の関数の動作が決まります。動作は、動的エラーの発生時に停止するか、または続行して事前決定済の値(空の順序またはエラー・メッセージ)を戻すかのどちらかです。ビュー自体の構成では、エラー発生時にビューに関連付けられている問合せが停止するか続行するかが決まります。この場合のエラーには、基礎となる関数によって発生したものが含まれますが、これに限定されません。

  • <output-element>を定義する<xqsview-source>要素について、基礎となる問合せまたは別の<xqsview-source>関数を使用してネストされた問合せの中のXQS関数によって、errorMessageエラー処理オプションが定義されているかどうかを確認してください。このような、onError="errorMessage"オプションを使用するネストされた<xqsview-source>関数では、それぞれ適切な<output-element>定義が指定される必要があります。この要件が満たされていない場合に、ネストされたXQSビュー関数でエラーがすると、XQSによって、その関数に対してxs:stringタイプの戻り値が作成されます。これは、宣言された最外部のXQSビュー関数のタイプに違反するため、タイプの不一致による追加のXQueryエラーが作成されます。

    その他のエラー処理オプションは、この要件の対象ではありません。

  • デフォルトのdynamicErrorモードでエラーが発生した場合は、XQSクライアントによって、例外が次のように伝播されます。まず、EJBによってEJB例外が戻されます。次に、XQSFacadeIインスタンスによってXQS例外をラップするXQS例外がスローされます。そして、JSPタグによって、標準のJSP errorPage属性を介して処理できるJSPタグ例外がスローされます。

  • XQSでは、エラー・オブジェクトが作成されるだけでなく(次の「XQSエラー・オブジェクトの取得」の項を参照)、全体的なOC4Jのロギング構成に基づいて、OC4Jログ・ファイルにエラーがレポートされます。XQSのエラー、警告または情報の各メッセージは、関連ログ・ファイル内で検索できます(ORACLE_HOME/j2ee/home/log/oc4j/log.xmlなど)。OC4Jロギングの一般情報は、『Oracle Containers for J2EE構成および管理ガイド』を参照してください。

XQSエラー・オブジェクトの取得

XQS関数がemptySequenceまたはerrorMessageのエラー処理モードを使用するように構成されていれば、XQSクライアントAPIの機能を使用して、エラー・オブジェクトのイテレータを取得でき、このイテレータから、問合せ中に発生した問題に関する情報を入手できます。概要は次のとおりです。

  • XQSFacadeIインタフェースまたはXQS EJB APIのどちらか一方(ステートフルまたはステートレス)を使用する場合は、次のメソッドを使用して、エラー・オブジェクトを含むイテレータを取得します。

    java.util.ListIterator getErrors()
    
  • XQS JSPタグ・ライブラリ(ステートフルまたはステートレス)を使用する場合は、executeタグまたはexecuteCursorタグのerrors属性の値として目的の変数名を指定します。JSPタグの実装により、ListIterator変数が作成され、この変数に、エラー・オブジェクトを含むイテレータが移入されます。

どちらの場合も、oracle.xqs.client.XQSErrorIオブジェクトを含むイテレータを取得できます。次に例を示します。

...
XQSFacadeI bean = XQSFactory.getXQSFacade();
...
bean.executeView(viewname, namespace, queryparams);
...
ListIterator errorIt = bean.getErrors();
XQSErrorI error = null;
while(errorIt.hasNext()) {
   error = (XQSErrorI)errorIt.next();
   (Process errors)
}
...
bean.close();
...

次に、JSPの例を示します。

XQSErrorI error=null;
...
<xq:executeCursor ... errors="errorIt" ... >
   ...
</xq:executeCursor>
...
<xq:next ... />
while(errorIt.hasNext()) {
   error = (XQSErrorI)errorIt.next();
   (Process errors)
}

詳細およびエラー情報取得の例は、次の「XQSエラー・オブジェクトからの情報の取得」および「例: エラーの取得および処理」の各項を参照してください。

XQSエラー・オブジェクトからの情報の取得

前項の「XQSエラー・オブジェクトの取得」で、oracle.xqs.client.XQSErrorIオブジェクトを含むjava.util.ListIteratorインスタンスの取得方法について説明しました。

このイテレータ・インスタンスを処理すると、個々のXQSErrorIオブジェクトを取得できます。ListIteratorタイプには、次のメソッドが含まれます。

  • Object next(): このメソッドを使用すると、イテレータ内に次の要素が戻されます。各要素は、XQSErrorIタイプにキャストできます。

  • boolean hasNext(): このメソッドを使用すると、要素が残っている場合にtrueが戻されます。

その後、個々のXQSErrorIインスタンスを使用して、問合せ中に発生した各エラーの情報を取得できます。


注意:

  • XQSによってXQSErrorIオブジェクトが戻されるのは、問合せで使用する1つ以上のXQS関数を、デフォルト以外のemptySequenceモードまたはerrorMessageモードを使用して構成した場合のみです。エラーが発生しなかった場合は、ListIteratorは空になります。

  • XQSErrorI Javaオブジェクトをタイプxs:nodeのエラー項目と混同しないでください。「XQS関数のエラー処理の構成」で説明しているように、後者は、場合によって、エラー発生時にXQS関数の戻り値としてXQSによって構成されます。XQSErrorIは、XMLノードではなくJavaオブジェクトです。XQSErrorIオブジェクトは、XQSのクライアントに戻されます。一方、XMLエラー・ノードは、XQuery実行に戻されます。また、エラー・モードがemptySequenceであっても、XQSErrorIオブジェクトが戻されます。これに対して、XMLエラー・ノードは、エラー・モードがerrorMessageの場合のみ構成されます。


この項では、エラー情報を取得するためのXQSErrorIメソッドを要約し、XQSエラーのタイプを要約します。完全な情報は、「XQSErrorIリファレンス」を参照してください。

XQSErrorIインスタンスでは、次の処理を行えます。ここに示す例では、xqserrというXQSErrorIインスタンスを使用しています。

  1. エラーを戻したXQS関数の修飾名を取得します。

    String funcname = xqserr.getFunctionQName();
    
  2. エラー・タイプを取得します(タイプの詳細は次の項を参照してください)。

    int errortype = xqserr.getErrorType();
    
  3. エラー・タイプの文字列表現を取得します。

    String typeStr= XQSErrorI.typeNames(xqserr.getErrorType()
    
  4. エラー・メッセージを取得します。

    String errormessage = xqserr.getErrorMessage();
    
  5. エラー・メッセージとは別にエラー・コードを提供するデータソース(OracleデータベースのORA-xxxxxコードなど)について、エラー・コードを取得します。

    String errorcode = xqserr.getErrorCode();
    
  6. 必要に応じて、ユーティリティ・メソッドを使用して関数名、エラー・タイプ、エラー・メッセージおよびエラー・コードを1つの文字列に一体化します。この文字列は、XML文字列(適切なXMLマークアップを含む文字列)またはXMLノードです。

    String errorstring = xqserr.toString();
    ...
    String errorxmlstring = xqserr.toXMLString();
    ...
    org.w3c.dom.node errornode = xqserr.toXMLNode();
    

エラー・タイプの整定数の要約は、次のとおりです。

  • XQSERR_MISSING_SRC: データソースが見つかりません。

  • XQSERR_SRC_ACCESS: データソースは見つかりましたがアクセス・エラー(無効なログインなど)が戻されました。

  • XQSERR_SRC_ERROR: データソースが見つかりアクセスしましたが、その他のエラーが戻されました。

  • XQSERR_PARAM: バインド・パラメータをソースに渡すとき、もしくはソースから出力パラメータを受け取るときに、問題が発生しました。

  • XQSERR_SRC_CONFIG: XQS構成の処理中に問題が発生しました。

  • XQSERR_INTERNAL: XQSで予期しない内部エラーが発生しました。

これらの定数の追加情報は、「XQSErrorIリファレンス」を参照してください。

例: エラーの取得および処理

この項では、単純なエラー処理の例および対応する構成を示します。

構成 「XQS関数のエラー処理の構成」で説明したように)XQSアプリケーションでXQSErrorIオブジェクトを使用するには、データソースがエラー・モードemptySequenceまたはerrorMessage用に構成されている必要があります。次の例では、errorMessageモードが使用されています。

<xqsview-source ... onError="errorMessage">
   <function-name prefix="xqs">BasicFileWS</function-name>
<output-element namespace="myNS">myElement</output-element>
   ...
</xqsview-source>

<error-message>要素が使用されていないため、戻される単一項目のXML結果順序には、事前定義済メッセージが含まれず、かわりにデータソースから取得されるメッセージがそのまま転送されます。XQSビュー関数で実際にエラーが発生すると、XQSによって<xqserror> XMLノードが構成され、そのノードが関数の結果として戻されます。エラー・メッセージは、<xqserror>ノードのテキスト値になります。XQSビュー構成によって<output-element>構成内のユーザー定義の要素が指定されるため、XMLのノード表現が選択されます。

Javaコード 次の例は、ビューを実行してから次のエラー処理を行うコードの一部分です。

  • XQSFacadeIインタフェースのgetErrors()メソッドをコールして、XQSErrorIオブジェクトのjava.util.ListIteratorインスタンスを取得します。

  • ListIteratorクラスのhasNext()メソッドを使用して、反復するエラー・オブジェクトの数を指定します。

  • エラーごとに、エラーの原因となったXQS関数の修飾名を出力してから、エラー・タイプ、エラー・メッセージおよびエラー・コードを出力します。

...
XQSFacadeI bean = XQSFactory.getXQSFacade();
String xqueryView = "BasicFileWS";
QueryParameterI param = XQSFactory.getQueryParameter("custName");
param.setString("John Ford");
QueryParameterI[] params = new QueryParameterI[1];
params[0] = param;
bean.executeView(xqueryView, null, params);
while(bean.getNextItem() !=null) {
}
ListIterator errors = bean.getErrors();
while(errors.hasNext()) {
   XQSErrorI error = (XQSErrorI)errors.next();
   System.out.println("The function which gives error is: " +
                        error.getFunctionQName());
   System.out.println("The error type is:"  + error.getErrorType()) +
", which means " +XQSErrorI.typeNames(error.getErrorType()));

   System.out.println("The error message is:" + error.getErrorMessage());
   System.out.println("The error code is:" + error.getErrorCode());
}
...

BPEL環境でのXQSの使用

XQueryおよびXQSは、Oracle Application Server上で実行されているOracle BPEL Process Managerから使用できます。


注意:

この項では、Oracle BPEL Process Managerに採用されている概念について記述します。この項では、Oracle BPELにおけるXQueryおよびXQSの使用に固有の概念のみを説明します。ここに記載される一般的なBPELおよびOracle BPELの概念の詳細は、『Oracle BPEL Process Manager開発者ガイド』を参照してください。

Oracle BPELには、Oracle BPEL Process ManagerによるXQueryベースのXML問合せを可能にするXPath機能があります。問合せはXQSビューに保存できます。XQSビューはフォルダ(2階層まで)および名前空間に編成できます。XQSビューを使用すると、あるXQSビューを他のXQSビューから呼び出すことで複雑な問合せを作成する機能が改善されるだけでなく、アプリケーションのモジュール性も向上します。


注意:

BPEL環境から起動される問合せは、XQSビューと同じように動作します。ただし、BPEL環境で使用可能な機能は、Oracle Application Serverで実行されている汎用J2EEアプリケーションのXQSビューと比べて制限されています。

この項には、次の項目が含まれます。

XQuery用のBPEL XPath機能の登録

Oracle BPELには、次に示すように、orabpel\domains\default\config\xpath-functions.xmlファイルに登録されているJavaクラス(com.collaxa.cube.xml.xpath.functions.xml.GetElementFromXQueryFunction)が用意されています。

<function id="processXQuery">
   <classname>
      com.collaxa.cube.xml.xpath.functions.xml.GetElementFromXQueryFunction
   </classname>   <comment>
      <![CDATA[This function returns result of XQuery execution. The
         signature of this function is
         <i>ora:processXQuery('view_name','context_node'?)</i>.]]>
   </comment>
   <property id="namespace-uri">
      <value>http://schemas.oracle.com/xpath/extension</value>
      <comment>Namespace URI for this function</comment>
   </property>
   <property id="namespace-prefix">
      <value>ora</value>
      <comment>Namespace prefix for this function</comment>
   </property>
</function>

この例では、GetElementFromXQueryFunction.classファイルをorabpel\system\classes\com\collaxa\cube\xml\xpath\functions\xmlディレクトリに配置したことを前提としています。ora:processXQuery関数は、BPELプロセス定義のその他のXPath関数と同じように使用されています。例:

<assign name="runXQuery">
   <copy>
      <from expression="'Associated Press'"/>
      <to variable="publisher"/>
   </copy>
   <copy>
      <from>
      <category xmlns="http://samples.otn.com">Computing</category>
      </from>
      <to variable="category"/>
   </copy>
   <copy>
      <from expression="ora:processXQuery
         ('books.xq',bpws:getVariableData('input','payload'))"/>
      <to variable="output" part="payload"/>
   </copy>
</assign>

BPEL XQuery関数のパラメータの使用

前の例(ora:processXQuery)で示されたOracle BPEL XQuery関数には2つのパラメータがあります。

  • view_name

  • context_node

view_nameパラメータは必須で、文字列である必要があります。このパラメータでは、実行する保存済のXQueryファイル(XQSビューとも呼ばれる)の名前を指定します。オプションで、ファイル名にはファイル拡張子.xqを指定することもできます。1つ目の引数が.xqで終わらない場合は、ファイルを検索する前にXQSによってファイル拡張子が追加されます。

context_nodeパラメータはオプションです。指定する場合、値はXMLノードである必要があります。このXMLノードは、実行される問合せのコンテキスト項目になります。詳細は、「XQueryを使用したコンテキスト項目へのアクセス」を参照してください。

XQueryを使用したコンテキスト項目へのアクセス

外部変数にバインドせずに、XMLドキュメントをXQuery式に渡すことができます。これは、ドキュメントのコンテキスト項目へのバインドと呼ばれます。問合せ式内では、コンテキスト項目には特別な構文(.)を使用してアクセスします。

たとえば、コンテキスト項目がルート要素<books>および一連の<book>子要素を持つドキュメントにバインドされている場合は、次の式が有効です。

for $i in ./book/title return $i

XMLドキュメントをXQueryコンテキスト項目としてバインドするには、BPEL XQuery関数のcontext_nodeパラメータを使用します。


注意:

コンテキスト項目は、Oracle BPEL環境でのみXQSによって実行されたXQueryに提供されます。この機能は、XQSを使用する汎用のJ2EEアプリケーションでは使用できません。ただし、XMLノードは、通常の問合せパラメータおよびXQS関数の引数としてXQueryに渡すことができます。

BPELにおけるXQSビュー機能の使用

XQSを使用すると、XQSビューと呼ばれるファイルに保存された問合せという形で、標準のXQuery言語を拡張できます。XQSには名前および関連付けられたXQuery式があります。

ビューの実装は、そのビューと関連付けられたXQuery式です。次に示す問合せ式を、ファイルmyView.xqと関連付けることができます。

for $i in  fn:doc("/dir/file.xml") return $i/line-item[@id=10]

トップレベルのビュー

トップレベルのビューは、BPELプロセスから直接起動されます。次の例では、myTopViewという名前のビューが、processXQuery XPath関数を使用してBPELプロセスから起動されています。

<copy>
   <from expression="ora:processXQuery('myTopView.xq'))"/>
   <to variable="output" part="payload"/>
</copy>

トップレベルのビューには次の規則が適用されます。

  • トップレベルのビューのXQueryファイルは、BPELプロセスのルートのスーツケース・フォルダに直接配置する必要があります。サブフォルダに配置することはできません。

  • 暗黙的に宣言された外部変数(次の項を参照)のみが、トップレベルのビューで使用されます。また、外部変数の名前は、ビューが呼び出されているプロセスのアクティブな範囲内にあるBPELプロセスの変数と一致している必要があります。

  • コンテキスト項目のドキュメントは、トップレベルのビューとのみ使用できます。

例として、myTopViewの内容を次に示します。

for $i in fn:doc("/dir/file.xml") return $i/line-item[@id=$bpelVar]

外部変数$bpelVarは宣言されておらず、BPELプロセス変数とみなされています。

ネストされたビュー

ネストされたビューは、別のXQSビューから呼び出されたXQSビューです。XQuery言語の構文に合せるため、呼出し元のビューはネストされたビューを外部関数として参照します。ネストされたビューでは、ビューの名前は外部関数の名前でもあり、そのビューを使用する別の問合せ式で宣言されます。次の例では、myViewがネストされたビューの名前です。

declare namespace bpel="urn:oracle.bpel.xq";
declare function bpel:myView($arg as xs:integer) as node()* external;

外部関数myView()が問合せ式で呼び出されるたびに、XQSが関数の整数パラメータをmyView()内の外部関数にバインドし、前の問合せを実行します。結果順序は、外部関数呼出しの結果です。

XQSビューは、基本的にストアド・クエリーであり、あるXQueryを別のXQuery内に埋め込むことができます。同時に、ネストされた問合せを他から分離し、モジュール化して個別に変更できるようにします。たとえば、外側(埋込み先)の問合せは次のようになります。

declare namespace bpel="urn:oracle.bpel.xq";
declare function bpel:myView($arg as xs:integer) as node()* external;
for $i in bpel:myView(2301) return $i/shipping-status

外部のXQSビュー関数は、関数と同じ名前のテキスト・ファイルを介して問合せと関連付けられます。ファイル拡張子は.xqです。たとえば、myView.xqという名前のファイルには次のテキストが含まれます。

declare variable $x as xs:integer external;
for $i in  fn:doc("/dir/file.xml") return $i/line-item[@id=$x]

これまでの例からわかるように、ネストされたすべてのビューはいずれかの名前空間に属します。この名前空間は、デフォルトのOracle BPELの名前空間urn:oracle.bpel.xq、またはユーザー定義の名前空間です。ネストされたビューをユーザー定義の名前空間にグループ化する方法は、「XQSビュー用のBPEL名前空間およびフォルダの使用」で説明します。

外部XQuery変数の使用

XQueryの外部変数を使用すると、XQuery式を別のXQuery式に埋め込む環境からの入力値を渡すことができます。この概念は、SQLのバインド変数に似ています。次に、3つの外部変数($x$yおよび$z)を宣言する単純な問合せの例を示します。問合せでは、変数の値が順番に戻されます。

declare variable $x as xs:string external;
declare variable $y as xs:integer external;
declare variable $z external;
($x, $y, $z)

外部変数のタイプの宣言は、変数$zで示されているようにオプションです。問合せに対する追加の静的および動的タイプ・チェックが実行され、アプリケーションがより堅牢になるため、あらかじめタイプがわかる場合にはタイプを指定して外部変数を宣言することをお薦めします。

また、XQueryでは外部変数を暗黙的に宣言できます。前もって宣言せずにXQuery式で変数表記($)が使用された場合、変数は暗黙的に宣言された外部変数とみなされます。次のXQuery式は、3つの外部変数が暗黙的に宣言されていること以外は前の例と同じです。

($x, $y, $z)

注意:

暗黙的に宣言された外部変数は、BPEL環境でのみ使用可能です。XQSを使用する汎用のJ2EEアプリケーションでは、問合せの中で明示的に宣言された外部変数のみを使用します。

XQuery評価では、すべての外部変数が実際の値にバインドされている必要があります。暗黙的に宣言された外部変数と明示的に宣言された外部変数では処理が異なります。外部変数が暗黙的に宣言されている場合、その名前は現在対象範囲内にあるBPELプロセス変数の名前と一致する必要があります。BPEL Process ManagerおよびXQSにより、プロセス変数の値が同じ名前の外部変数にバインドされます。


注意:

暗黙的に宣言された外部変数を使用できるのは、BPEL XQuery関数から直接呼び出されたビューでのみで、ネストされたXQSビューでは使用できません。XQSビューでBPELプロセス変数を使用するその他の例は、「XQSビューにおけるBPELプロセス変数の使用」を参照してください。

XQueryの外部変数が問合せ内で明示的に宣言されている場合、そのビューで外部変数が宣言されている順序に従って、変数の値はXQSビュー関数に対する引数から取得されます。別のビューからXQS関数として起動されたXQSビューは、ネストされたビューと呼ばれます。


注意:

BPEL環境では、明示的に宣言された外部変数は、ネストされたビューでのみ使用されます。

まとめると、XQSビューがBPEL XQuery関数から直接起動された場合、そのビューで使用するのは暗黙的に宣言された外部変数のみの必要があります。また、その値は、XQuery関数が呼び出された際に対象範囲であった同じ名前のBPELプロセス変数から取得されます。例:

topLevelView.xq XQSビュー・ファイル内の問合せ

for $b in $bpelVar1/a/b return $b[@id = $bpelVar2]

この問合せは、変数$bpelVar1および$bpelVar2が対象範囲であるBPELプロセスで起動されます。

<copy>
   <from expression="ora:processXQuery('topLevel.xq')"/>
   <to variable="output" part="payload"/>
</copy>

XQSの外部変数を使用してXQSビューが別のXQSビューから起動された場合、そのビューで使用されるのは明示的に宣言された外部変数のみである必要があります。XQSビュー関数の引数の値は引数が渡された順序で取得され、そのビューで変数が宣言された順序で外部変数に割り当てられます。nestedView.xq XQSビュー・ファイルの例を示します。

declare variable $x as element() external;
declare variable $y as xs:integer external;
for $b in $x/a/b return $b[@id = $y]

nestedView問合せは、topViewという別のビューから起動されます。topView.xqの内容は次のとおりです。

declare namespace ns1="folder1";
declare function ns1:nestedView($arg1 as element(), $arg2 as xs:integer) external;
let $el := <x>
              <a>
                 <b id="1">b-content</b>
              </a>
           </x>return ns1:nestedView($el, 1)

nestedViewを実行する前に、XQSでは外部変数$xを要素<x>に、外部変数$yを整数1にバインドします。

XQSビューにおけるBPELプロセス変数の使用

XQuery XPath関数から直接呼び出されたXQSビューでは、そのビュー内で追加の宣言を行わずに、BPELプロセスで宣言された変数を使用できます。BPELプロセスに変数$bpPurchaseAmtおよび$stateが含まれ、これらの変数にはBPELプロセス内で値が割り当てられているとします。また、XQSビュー・ファイル(purchaseAmtAddTax.xq)はBPELプロセスとともにパッケージ化されており、次のような内容だとします。

declare namespace bpl = "urn:oracle.bpel.xq";
declare function bpl:stateTax($st as xs:string) as xs:decimal external;
$bpPurchaseAmt *(1+ bpl:stateTax($state))

この例では、別のXQSビュー・ファイル(stateTax.xq)もBPELプロセスとともにパッケージ化されていると仮定されています。例では、2つの外部変数($bpPurchaseAmtおよび$state)が使用されています。これらの外部変数は問合せ内では宣言されていません。検証を成功させるためには、BPELプロセス内のXQuery XPath関数からXQSビューを呼び出す必要があります。また、プロセスには、対象範囲内の変数$bpPurchaseAmtおよび$stateが含まれていて、その値が処理する問合せに対して適切である必要があります。

XQSビュー用のBPEL名前空間およびフォルダの使用

BPEL環境内でのXQSビュー用の名前空間およびフォルダの使用には、2つのオプションがあります。

  • デフォルトの名前空間およびフォルダを使用

  • カスタムの名前空間およびサブフォルダを使用

デフォルトの名前空間およびフォルダ

XQueryファイルのデフォルトの場所は、BPELプロセス・スーツケースのルート・フォルダです。XQSは、名前空間とフォルダを関連付けます。デフォルトのXQueryフォルダは、デフォルトのOracle BPEL名前空間urn:oracle.bpel.xqと関連付けられます。この名前空間を指定するには、dfltbpelmyrootなど、任意の接頭辞を使用できます。BPELプロセスから直接起動されたビューであるすべてのトップレベルのXQSビューは、デフォルトのフォルダに配置する必要があります。つまり、トップレベルのすべてのビューはデフォルトの名前空間urn:oracle.bpel.xqに属します。そのため、XQuery processXQuery関数にビューの名前が渡される際には、デフォルトの名前空間は渡されません。デフォルトのフォルダに配置されたビューも、デフォルトの名前空間の接頭辞を使用してネストされたビューとして起動されます。次のフォルダ構造があるとします。

<process suitcase root>   /view1.xq   /view2.xq

view2.xqを起動できるview1.xqの内容は次のとおりです。

declare namespace dflt = "urn:oracle.bpel.xq";
declare function dflt:view2($st as xs:string) as xs:decimal;
for $i in dflt:view2("Oracle") return $i

カスタムの名前空間およびサブフォルダ

Oracle BPEL環境のXQSには、問合せをデフォルト・フォルダのサブフォルダに編成するオプションもあります。サブフォルダは1階層のみです。たとえば、次のようなフォルダ構造では、XQSはビューview1.xqview2.xqview3.xqview4.xqおよびview5.xqを検出できます。一方、invisible.xqはスーツケースのルートから2階層下のフォルダにあるため、XQSで検出できません。

<process suitcase root>
   /view1.xq
   /view2.xq
   /subfolder1
      /view3.xq
      /view4.xq
      /subfolder12
         /invisible.xq
   /subfolder2
      /view5.xq

サブフォルダに配置されたビューは、ネストされたビューとしてのみ使用されます。ネストされたすべてのビューは、呼出し元の問合せで外部関数として宣言する必要があるため、名前空間に属している必要があります。サブフォルダに配置されたビューの名前空間が、サブフォルダの名前になります。ただし、その名前空間に任意の接頭辞を1つ以上付けることができます。フォルダ構造の例では、subfolder1/およびsubfolder2/のビューを起動する前に、次の宣言が使用されています。

declare namespace dflt="urn:oracle.bpel.xq";
declare namespace sub1="subfolder1";
declare namespace sub2="subfolder2";
declare function dflt:view1() as external;
declare function sub1:view4() as external;
declare function sub2:view5() as external;

注意:

XQueryでは、あるフォルダの別のフォルダに対する相対位置は計算されません。呼出し元の問合せがどこに配置されているかにかかわらず、ネストされたビューが配置されているフォルダの名前から導出される名前空間によって、ネストされたビューを参照してください。

フォルダ構造の前の例で説明すると、view1.xqおよびview3.xqは次のようにしてview5.xqから起動されます。

declare namespace dflt="urn:oracle.bpel.xq";
declare namespace sub1="subfolder1";
declare function dflt:view1() as external;
declare function sub1:view3() as external;

dflt:view1()//price - sub1:view3()//discount

ビューの名前としてのURLの使用

XQSでは、ローカル・ファイル・システムのファイルだけでなく、(http:ftp:またはfile:プロトコルを使用している)有効なWeb URLを使用してアクセス可能なビューを起動することもできます。ビューの名前がURLの場合、アクセスするファイルの正確な名前を反映している必要があります(XQSでは、.xqファイル拡張子は追加されません)。また、ビューのテキスト・ファイルが、起動時にそのURLからアクセスできる必要があります。例:

<copy>
   <from expression="ora:processXQuery
      ('http://myhost/bpeldemos/views/myView.xq')"/>
   <to variable="output" part="payload"/>
</copy>

注意:

URLをビューの名前として使用できるのはトップレベルのビューにおいてのみで、ネストされたビューでは使用できません。

XQSクライアントAPIリファレンス

この項では、XQS publicクラスおよびユーザー・インタフェースに関するリファレンス・ドキュメントを提供します。

XQSFactoryリファレンス

この項では、oracle.xqs.client.XQSFactoryクラスのメソッドを示します。ファクトリ・クラスは、メインのXQSクライアント・インタフェースXQSFacadeIおよびQueryParameterIのインスタンスの作成に使用されます。これらのメソッドは、ファクトリによって戻される特定のインタフェースが記載されている後続の項で詳細に説明されています。oracle.xqs.client.XQSFactoryクラスには次のメソッドがあります。

  • XQSFacadeI getXQSFacade()

  • QueryParameterI getQueryParameter()

  • QueryParameterI getQueryParameter(String namespace, String localName)

  • QueryParameterI getQueryParameter(String localName)

XQS QueryParameterIリファレンス

この項では、oracle.xqs.client.QueryParameterIインタフェースおよびそのメソッドの取得に使用されるファクトリ・メソッドについて説明します。QueryParameterI配列は、XQSの汎用Java APIまたはEJB APIの使用時に、問合せの外部変数をバインドするために使用します。

「例3: XQSFacadeI APIを使用したXQSビュー」には、入力パラメータのQueryParameterIの使用例が含まれています。

QueryParameterIを戻すファクトリ・メソッド

oracle.xqs.client.XQSFactoryクラスには、QueryParameterIインタフェースのインスタンスを作成する次のメソッドがあります。

  • getQueryParameter()

  • getQueryParameter(String namespace, String localName)

  • getQueryParameter(String localName)

QueryParameterIインスタンスをXQSFactoryファクトリから取得する際には、バインドする外部XQuery変数の名前を指定します。この名前は、XQueryプロローグ内の対応する外部変数宣言の名前と一致する必要があります。また、名前を付けずにQueryParameterIインスタンスを作成し、QueryParameterIインタフェースのsetName()メソッドを使用して後からパラメータ名を設定できます。この名前も、XQueryプロローグの外部変数の名前と一致する必要があります。XQuery変数ではXML名が使用されるため、QueryParameterIコンストラクタでは、名前空間用とローカル名用の2つの文字列値を使用できます。名前空間を指定しない場合は、修飾名内の名前空間に、nullが割り当てられます。

QueryParameterIのメソッド

QueryParameterIインタフェースでは、外部XQuery変数の値を設定するための、次のメソッドが提供されます。これらのメソッドは、XQSでサポートされているXML型、およびそれに対応するJava型を反映しています。「サポートされている問合せパラメータのタイプ」も参照してください。パラメータ名を設定および取得するメソッドや、パラメータがNULLかどうかを確認するメソッドもあります。

  • javax.xml.namespace.QName getName()

    このメソッドは、パラメータ名の特定に使用します。

  • void setName(String namespace, String localPart)

    このメソッドは、名前空間およびQNameのローカル部分を指定してパラメータ名を設定するために使用します。

  • boolean isNull()

    このメソッドは、パラメータ値がNullに設定されているかどうかを特定するために使用します。パラメータをNullに設定するには、この項にリストされているset*Null()メソッドのいずれかを呼び出します。初期化されていないパラメータは、Nullに設定されているとはみなされません。

  • void setBase64Binary(String value)

    このメソッドは、Java文字列(たとえば、vYrfOJ39673//-BDiIIGHSPM=+)で表された、XML base64Binary型に対応するBase64Binary値のバインドに使用します。

  • void setBase64BinaryNull()

    このメソッドは、Base64Binary外部変数をNullにバインドするために使用します。

  • void setBoolean(boolean value)

    このメソッドは、XML boolean型に対応するboolean値のバインドに使用します。

  • void setBooleanNull()

    このメソッドは、boolean外部変数をNullにバインドするために使用します。

  • void setDateTime(java.util.GregorianCalendar value boolean isTimeZoneSet)

    このメソッドは、XML dateTime型に対応する、ある特定の時間を表すGregorianCalendar値のバインドに使用します。カレンダ・オブジェクトのTimeZoneプロパティが設定されている場合は、isTimeZonetrueに設定します。(GregorianCalendarオブジェクトの使用に関する情報は、http://java.sun.com/j2se/1.4.2/docs/api/を参照してください。)

  • void setDateTimeNull()

    このメソッドは、boolean外部変数をNullにバインドするために使用します。

  • void setDateTime(String strValue)

    このメソッドは、XML dateTime型に対応する、ある特定の時間を表すString値のバインドに使用します。

  • void setDecimal(java.math.BigDecimal value)

    このメソッドは、XML decimal型に対応するBigDecimal値のバインドに使用します。

  • void setDecimalNull()

    このメソッドは、decimal外部変数をNullにバインドするために使用します。

  • void setDouble(double value)

    このメソッドは、XML double型に対応するdouble値のバインドに使用します。

  • void setDoubleNull()

    このメソッドは、double外部変数をNullにバインドするために使用します。

  • void setDuration(String value)

    このメソッドは、XML duration型に対応する、期間を表すString値のバインドに使用します。期間の字句(文字列)表現の情報は、http://www.w3.org/TR/xmlschema-2/#durationを参照してください。

  • void setDurationNull()

    このメソッドは、boolean外部変数をNullにバインドするために使用します。

  • void setDayTimeDuration(double seconds)

    このメソッドは、XML dayTimeDuration型に対応する、期間の値(秒単位)のdayTime部分を表すdouble値のバインドに使用します。dayTimeDurationの表現の情報は、http://www.w3.org/TR/xmlschema-2/#dayTimeDurationを参照してください。

  • void setDayTimeDurationNull()

    このメソッドは、DayTimeDuration外部変数をNullにバインドするために使用します。

  • void setYearMonthDuration(int months)

    このメソッドは、XML yearMonthDuration型に対応する、期間の値(月単位)のyearMonth部分を表すint値のバインドに使用します。yearMonthDurationの表現の情報は、http://www.w3.org/TR/xmlschema-2/#yearMonthDurationを参照してください。

  • void setYearMonthDurationNull()

    このメソッドは、yearMonthDuration外部変数をNullにバインドするために使用します。

  • void setFloat(float value)

    このメソッドは、XML float型に対応する浮動小数点値のバインドに使用します。

  • void setFloatNull()

    このメソッドは、float外部変数をNullにバインドするために使用します。

  • void setHexBinary(String value)

    このメソッドは、Java文字列(たとえば、0FB7)で表された、XML hexBinary型に対応する16進バイナリ値のバインドに使用します。

  • void setHexBinaryNull()

    このメソッドは、hexBinary外部変数をNullにバインドするために使用します。

  • void setInt(int value)

    このメソッドは、XML int型に対応するinteger値のバインドに使用します。

  • void setIntNull()

    このメソッドは、int外部変数をNullにバインドするために使用します。

  • void setInteger(int value)

  • void setInteger(long value)

  • void setInteger(java.math.BigInteger value)

    いずれかのsetInteger()メソッドを使用して、XML integer型に対応する整数値をバインドします。値の表現または大きさに基づいて、適切なシグネチャを選択します。

  • void setIntegerNull()

    このメソッドは、integer外部変数をNullにバインドするために使用します。

  • void setLong(long value)

    このメソッドは、XML long型に対応するlong整数値のバインドに使用します。

  • void setLongNull()

    このメソッドは、long外部変数をNullにバインドするために使用します。

  • void setString(String value)

    このメソッドは、XML string型に対応するJava string値のバインドに使用します。

  • void setStringNull()

    このメソッドは、string外部変数をNullにバインドするために使用します。

  • void setAnyURI(java.net.URI value)

    このメソッドは、XML anyURI型に対応するURI値のバインドに使用します。

  • void setAnyURINull()

    このメソッドは、anyURI外部変数をNullにバインドするために使用します。

  • void setNode(org.w3c.dom.Node value)

    このメソッドは、XML anyType型またはユーザー定義のXML型に対応するXMLノードのバインドに使用します。

  • void setNodeNull()

    このメソッドは、外部変数anyTypeまたはユーザー定義のXML型をNullにバインドするために使用します。


注意:

QueryParameterIクラスには、これらのsetterメソッドに対応するgetterメソッドはありません。

XQSFacadeIリファレンス

この項では、oracle.xqs.client.XQSFacadeIインタフェースおよびそのメソッドの取得に使用されるファクトリ・メソッドについて説明します。このインタフェースは、XQSが提供する汎用目的のJavaクライアントAPIです。使用方法および例は、「Javaインタフェース・クライアントAPIの使用方法」を参照してください。

XQSFacadeIを戻すファクトリ・メソッド

oracle.xqs.client.XQSFactoryクラスには、XQSFacadeIインタフェースのインスタンスを作成する次のメソッドがあります。

  • getXQSFacade()

XQSFacadeIのメソッド

XQSFacadeIインタフェースでは、次のメソッドが提供されます。

  • void execute(String xquery, QueryParameterI[] params)

    このメソッドを使用して、非定型問合せを実行します。問合せを含む文字列、およびバインド・パラメータのQueryParameterI配列を渡します。(「XQS QueryParameterIリファレンス」を参照してください。)渡すパラメータがない場合、配列はnullになります。

  • void executeView(String viewName, String namespace, QueryParameterI[] params)

    このメソッドを使用して、XQSビューを直接実行します。ローカル名および名前空間を(文字列として)指定することでビュー名を渡し、バインド・パラメータのQueryParameterI配列(またはnull)を渡します。ビュー名および名前空間は、ともに修飾名の定義に使用されるため、<xqsview-source><function-name>サブ要素、およびそのnamespace属性またはprefix属性に基づいて、構成内の対応する関数名および名前空間と一致する必要があります。

  • oracle.xml.xqxp.datamodel.XMLItem getNextItem()

    execute()またはexecuteView()を使用した後、getNextItem()を使用して結果順序内の次の項目をOracle XMLItemインスタンスとして取得します。最初のgetNextItem()コールでは、順序内の最初の項目が戻されます。最後の項目を取得した後にこのメソッドをコールすると、nullが戻されます。


    重要:

    getNextItem()メソッドをコールすると、XQueryによって項目の評価がトリガーされます。問合せの実行時に要求されるリソース(データベース接続やファイル・ハンドラなど)は、最後のgetNextItem()コールが終わるまで解放されません。

  • java.util.ListIterator getErrors()

    問合せで使用するいずれかのXQS関数を、エラーの発生後も続行するように構成した場合は(「XQS関数のエラー処理の構成」を参照)、getErrors()を使用して、XQS関数の実行時に発生した可能性があるエラーの情報を取得できます。このメソッドでは、XQSErrorIオブジェクトのコレクションに対するイテレータが戻されます。このイテレータから、各エラーの詳細を取得できます。(「XQSErrorIリファレンス」を参照してください。)エラーが発生しなかった場合は、イテレータによって空のコレクションがポイントされます。

  • void close()

    このメソッドを使用して、問合せに関連付けられているすべてのリソースを解放します。close()は、問合せ結果をすべて取得した後でコールするのが適正です。

XQS EJBクライアントAPIリファレンス

この項では、リモートEJB用のXQSClientRemoteインタフェースとXQSClientHomeインタフェース、およびローカルEJB用のXQSClientLocalインタフェースとXQSClientLocalHomeインタフェースを介してXQSでサポートされる、EJBクライアント・メソッドについて説明します。ステートフル・セッションBeanまたはステートレス・セッションBean用に、これらのインタフェースには複数のバージョンがあります。

使用方法および例は、「EJBクライアントAPIの使用方法」を参照してください。

ステートフルEJBクライアント・メソッド

ステートフル・セッションBeanでは、次に示すOracle固有のメソッドを、パッケージoracle.xqs.client.ejb.statefulに含まれるEJBインタフェースから使用できます。これらのメソッドの機能は、「XQSFacadeIリファレンス」に含まれる同じ名前のメソッドと同じです。

  • void execute(String xquery, QueryParameterI[] params) throws EJBException

  • void executeView(String viewName, String namespace, QueryParameterI[] params) throws EJBException

  • oracle.xml.xqxp.datamodel.XMLItem getNextItem() throws EJBException

  • java.util.ListIterator getErrors()

  • void close()

ステートレスEJBクライアント・メソッド

ステートレス・セッションBeanでは、パッケージoracle.xds.client.ejb.statelessに含まれるEJBインタフェースを介して、次に示すOracle固有のメソッドを使用できます。

  • java.util.Vector execute(String xquery, QueryParameterI[] params) throws EJBException

    このメソッドを使用して、非定型問合せを実行します。問合せを含む文字列、およびバインド・パラメータのQueryParameterI配列を渡します。(「XQS QueryParameterIリファレンス」を参照してください。)渡すパラメータがない場合、配列はnullになります。結果は完全にマテリアライズされ、Vectorインスタンス内に戻されます。

  • java.util.Vector executeView(String viewName, String namespace, QueryParameterI[] params) throws EJBException

    このメソッドを使用して、XQSビューを実行します。ローカル名および名前空間を(文字列として)指定することでビュー名を渡し、バインド・パラメータのQueryParameterI配列(またはnull)を渡します。ビュー名および名前空間は、ともに修飾名の定義に使用されるため、<xqsview-source><function-name>サブ要素、およびそのnamespace属性またはprefix属性に基づいて、構成内の対応する関数名および名前空間と一致する必要があります。結果は完全にマテリアライズされ、Vectorインスタンス内に戻されます。

  • java.util.ListIterator getErrors()

    このメソッドには、「XQSFacadeIリファレンス」に含まれる同じ名前のメソッドと同じ機能があります。

XQS JSPタグ・ライブラリのリファレンス

XQSでは、XQueryへのステートフル・アクセスまたはステートレス・アクセス用のカスタムJSPタグが提供されます。

使用方法および例は、「JSPタグ・ライブラリの使用方法」を参照してください。

JSPタグ・ライブラリの使用に関する一般情報は、『Oracle Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


注意:

ここで示すタグ構文には、接頭辞xq:が使用されています。これは慣例によるもので、必須ではありません。taglibディレクティブでは、接頭辞を必要に応じて指定できます。

タグ構文に関して、次のことに注意してください。

  • イタリックは、値または文字列を指定する場所を示します。

  • オプションの属性は、大カッコ[...]で囲まれます。

  • オプション属性のデフォルト値は、太字で示されます。

  • 属性値の選択肢は、縦線 | で区切られます。

  • 注釈がないかぎり、JSP実行時式を使用して、タグの属性値<%= jspExpression %>を設定できます。


ステートフル・アクセス用JSPタグ

これらのタグは、XQueryへのステートフル・アクセスを使用する場合に使用します。

XQS executeCursorタグ

このタグを使用して、問合せの準備および実行を行います。構文は次のとおりです。(paramサブタグは、すべてのバインド・パラメータに使用されます。後続の説明を参照してください。)

<xq:executeCursor
  [ xqueryString = "query" ]
  [ xqsViewName = "viewname" ]
  [ namespace = "namespace" ]
    cursorId = "cursorname"
  [ maxItems = "maxnumber" ]
  [ toWriter = "true" | "false" ]
    toXMLDoc = "docname"
    resultItems = "arrayname"
    errors = "errorvarname" >

   <xq:param ... />
   <xq:param ... />
   ...

</xq:executeCursor>

重要:

  • 問合せ入力には、xqueryString属性を使用するか、xqsViewName属性とnamespace属性を使用する必要があります。

  • 出力属性toXMLDocresultItemsおよびerrorsの変数名を指定する必要があります。


executeCursorタグの属性は、次のように使用します。

  • xqueryString: 非定型問合せを使用する場合は、この属性を使用して、問合せの完全なXQuery構文を指定します。通常は、文字列変数で問合せを定義し、その変数の名前をJSP式で指定するのが最も簡単です。

    String myquerystring = "...";
    ...
    <xq:executeCursor ... xqueryString = "<%=myquerystring%>" ... >
       ...
    </xq:executeCursor>
    
  • xqsViewName: XQSビューを使用する場合は、この属性を使用してビューを指定します。厳密には、これは、構成内の対応するXQS関数の名前です。

  • namespace: xqsViewNameを使用してビューを指定する場合は、namespaceも併用して、XQS構成に基づいてビューのXQS関数の名前空間を指定する必要があります。

  • cursorId(必須): このタグを使用して、カーソルの変数の名前を指定し、後で使用できるようにします。(この変数は、JSPコンテナによって宣言されます。)指定した変数名は、nextタグを使用してカーソルから結果を取得するとき、およびcloseタグを使用してカーソルをクローズするときに参照します。次に例を示します。

    <xq:executeCursor ... cursorId="mycursor" ... >
       ...
    </xq:executeCursor>
    ...
    <xq:next cursorId="mycursor" />
    ...
    <xq:close cursorId="mycursor" />
    
  • maxItems: maxItems="10000"のように、問合せから受け取る項目の最大数を指定する場合に使用します。超過分の項目は廃棄され、maxItemの項目を受け取った後は、nextタグによって値が戻されなくなります。

  • toWriter: trueに設定すると、JSP出力ストリームに問合せ結果が出力されます。書込みは、nextタグが実行されるたびに行われます。

  • toXMLDoc(必須): XML DOMドキュメントに問合せ結果を出力するために、関連するnextタグで使用される変数の名前を指定します。ドキュメントは、executeCursorタグの後に使用できます。タイプorg.w3c.dom.Documentの変数は、JSPコンテナによって宣言されます。次に例を示します。

    <xq:executeCursor cursorId="mycursor" toXMLDoc="mydoc" ... >
       ...
    </xq:executeCursor>
    
    <xq:next cursorId="mycursor" />
    
    Element root = mydoc.getDocumentElement();
    ...
    

    executeCursorタグの使用後は、nextタグを実行するたびに、ドキュメントmydoc内で収集された結果ノードのバッチを受け取ります。


    重要:

    • toXMLDocドキュメントでは、XMLノードの結果のみが収集されます。プリミティブ型の結果は、XML文書では無視されますが、resultItems配列を介して収集されます。

    • toXMLDocドキュメントでは、nextタグの1回の実行で取得された項目のバッチのみが保持されます。その後、nextを実行するたびに、保持されていた項目が新しい項目のセットに上書きされます。

    • toXMLDoc属性に対して実行式を使用することはできません。



    注意:

    指定した名前は、ドキュメントのルート要素名としても使用されます。

  • resultItems(必須): 配列リストに問合せ結果を出力するために、関連するnextタグで使用される変数の名前を指定します。タイプjava.util.ArrayListの変数は、JSPコンテナによって宣言されます。ArrayListインスタンスは、executeCursorタグの後に使用できます。次に例を示します。

    <xq:executeCursor ... resultItems="myobjects" ... >
       ...
    </xq:executeCursor>
    
    Node node = (Node)myobjects.get(0);
    ...
    

    executeCursorタグの使用後は、nextタグを実行するたびに、myobjects変数から結果項目にアクセスできます。


    重要:

    • resultItems変数では、nextタグの1回の実行で取得された項目のバッチのみが保持されます。その後、nextを実行するたびに、保持されていた項目が新しい項目のセットに上書きされます。

    • resultItems属性に対して実行式を使用することはできません。


  • errors(必須): XQS問合せの実行により発生したエラーの取得に使用する変数の名前を指定します。タイプjava.util.ListIteratorの変数は、XQSErrorIオブジェクト(エラーごとに1つのオブジェクト)のコレクションに対するイテレータのJSPコンテナによって宣言されます。イテレータは、executeCursorタグの後に使用できます。次に例を示します。

    <xq:executeCursor cursorId="mycursor" errors="myerroriter" ... >
       ...
    </xq:executeCursor>
    <xq:next cursorId="mycursor" />
    
    XQSErrorI error = (XQSErrorI)myerroriterator.next();
    ...
    

    XQSErrorIオブジェクトの使用方法は、「XQSErrorIリファレンス」を参照してください。


    重要:

    errors属性に対して実行式を使用することはできません。

XQS paramタグ

executeCursorおよびexecuteのサブタグです。このタグを使用して、問合せの外部バインド・パラメータ(1つのparamタグ・パラメータ)を指定します。構文は次のとおりです。

<xq:param
    localName = "localvarname"
  [ namespace = "namespace" ]
    value = "bindvalue"
    type = "bindparamtype"
/>

paramタグの属性は、次のように使用します。

  • localName(必須): 外部変数名のローカル部分の指定に使用します。

  • namespace: 外部変数名の名前空間部分の指定に使用します。名前空間を伴わないローカル変数名も使用できるため、この属性はオプションです。

  • value(必須): バインドされる値に使用します。推定上、この値はJSP実行時式を使用したランタイム値になります。

    <xq:param ... value = "<%=jspExpression%>"... />
    

    注意:

    バインド値のタイプは、表8-3で示すように、type属性の設定に対応している必要があります。

  • type(必須): XQS QueryParameterIインタフェースによって対応するJava型がサポートされているXML型を示す、バインド・パラメータのデータ型の指定に使用します。サポートされている設定および使用に適した型は、表8-3を参照してください。(「サポートされている問合せパラメータのタイプ」も参照してください。)

表8-3 type属性の設定および対応するJava型

type属性の設定 対応するJava型

boolean

java.lang.Boolean

string

java.lang.String

int

java.lang.Integer

integer

java.lang.Integer, java.lang.Long, java.math.BigInteger

long

java.lang.Long

float

java.lang.Float

double

java.lang.Double

decimal

java.math.BigDecimal

base64Binary

java.lang.String

(値の表現。)

hexBinary

java.lang.String

(値の表現。)

anyURI

java.net.URI

dateTime

java.util.GregorianCalendar

(前提条件: カレンダ値のタイムゾーンが適切に初期化されていること。)

duration

java.lang.String

(期間の字句表現。説明はhttp://www.w3.org/TR/xmlschema-2/#durationを参照。)

node

java.lang.String

(ノードのテキスト表現。XMLパーサーによって解析される。)


XQS nextタグ

このタグを使用して、項目またはバッチごとに、executeCursorタグから結果を処理します。その際には、そのタグで指定したカーソルID名が参照されます。nextタグの構文は次のとおりです。

<xq:next
    cursorId = "cursorname"
  [ batchSize= "numitems" ]
  [ itemsFetched = "intvarname" ]
/>

nextタグの属性は、次のように使用します。

  • cursorId(必須): この属性を使用して、executeCursorタグでの指定に従って、問合せのカーソル名を参照します。カーソルは、まだオープンである(同じカーソル名を指定するcloseタグがまだ存在していない)ことが必要です。

  • batchSize: XQSでの問合せにバッチ・モードを使用する場合は、この属性を使用します。nextタグを実行するたびにカーソルからフェッチする項目数を、整数値で指定します。デフォルトは1(バッチ不使用)です。

  • itemsFetched: 現在のnextタグの実行でカーソルからフェッチされた項目数を示す値のjava.lang.Integer変数の名前を指定します。この変数は、JSPコンテナによって宣言されます。

次に例を示します。

...
<xq:executeCursor cursorId="mycursor"
                  resultItems="myresults"
                  toXMLDoc="mydoc"
                  errors="myerrors" ... >
   <xq:param ... />
   ...
</xq:executeCursor>
<%
  int items;
  do {
  // Populate output vehicles (myresults array and mydoc document)
%>
   <xq:next
                cursorId="mycursor"
                itemsFetched="fetched" />
<%
  items = fetched.intValue();
  } while(items>0)
  // ... Here is where you would retrieve results from the output vehicles ...
%>
...
XQS closeタグ

executeCursorタグを使用する)ステートフルJSPの場合は、closeタグを使用して、問合せに関連付けられているすべてのリソースを解放します。構文は次のとおりです。

<xq:close
    cursorId = "cursorname"
/>

closeタグの属性は、次のように使用します。

  • cursorId(必須): この属性を使用して、executeCursorタグでの指定に従って、クローズする問合せに対応するカーソル名を参照します。

ステートレス・アクセス用JSPタグ

XQueryへのステートレス・アクセスを使用する場合は、executeタグを使用します。

XQS executeタグ

このタグを使用して、問合せの準備および実行を行います。構文は次のとおりです。

<xq:execute
  [ xqueryString = "query" ]
  [ xqsViewName = "viewname" ]
  [ namespace = "namespace" ]
  [ maxItems = "maxnumber" ]
  [ toWriter = "true" | "false" ]
    toXMLDoc = "docname"
    resultItems = "arrayname"
    errors = "errorvarname" >

   <xq:param ... />
   <xq:param ... />
   ...

</xq:execute>

重要:

  • 問合せ入力には、xqueryString属性を使用するか、xqsViewName属性とnamespace属性を使用する必要があります。

  • 必須の属性toXMLDocresultItemsおよびerrorsを使用して、出力媒体の変数名を指定する必要があります。


cursorIdを除き、このタグでは、(ステートフル・アクセス用の)executeCursorタグと同じ属性が使用されます。executeCursorと同様に、バインド・パラメータに対してXQS paramサブタグも使用されます。「XQS executeCursorタグ」および「XQS paramタグ」を参照してください。

XQSErrorIリファレンス

この項では、インタフェースoracle.xqs.client.XQSErrorIのリファレンス・ドキュメントを提供します。

問合せで使用するいずれかのXQS関数を、エラーの発生後も続行するように構成した場合は(「XQS関数のエラー処理の構成」を参照)、問合せのXQS関数の実行時に発生した可能性があるエラーの情報を取得できます。エラーは、XQSErrorIオブジェクトのイテレータ内に戻されます。

XQSErrorIインタフェースでは、エラーが発生したXQS関数、エラーのタイプ(XQS固有の指定)、エラー・メッセージおよびエラー・コード(適用される場合)などの主な情報を様々な書式で戻すメソッドが多数提供されます。使用方法および例は、「XQSエラー・オブジェクトからの情報の取得」を参照してください。

  • String getFunctionQName()

    このメソッドは、エラーが発生したXQS関数の完全修飾名を取得する場合に、次のように使用します。

    {namespace_URI}/local_name
    
  • int getErrorType()

    このメソッドは、次のようなXQSエラー・タイプの指定を示す整定数を取得するために使用します。

    • XQSERR_MISSING_SRC: HTTP 404エラーが戻された、ドキュメント・ソースのファイルが見つからない、ソースが停止している、目的の表がデータベース・ソースに存在しないなどの理由で、データソースが見つかりません。

    • XQSERR_SRC_ACCESS: データソースは見つかりましたがアクセス・エラーが戻されました。これには、OracleデータベースのORA-xxxxxエラー、Webサイトのログイン・エラー、ドキュメント・ソース読取り時のパーサー・エラーなどが含まれます。

    • XQSERR_SRC_ERROR: データソースは見つかりましたが、アクセス・エラー以外のなんらかのエラーが戻されました。これには、Webサービスのフォルト・メッセージ、データベース・ソースのSQLエラーなどが含まれます。

    • XQSERR_PARAM: バインド・パラメータをデータソースに渡すとき、もしくはデータソースから出力パラメータを受け取るときに、XQSで問題が発生しました。これが戻されるのは、たとえば、WSDLドキュメントに従って要求される対応データ型に入力文字列を変換できなかった場合や、使用する特定の変換機能でXML以外のファイルをXML文書に変換できなかった場合などです。

    • XQSERR_SRC_CONFIG: XQS関数の構成の処理中に、XQSで問題が発生しました。

    • XQSERR_INTERNAL: XQSで予期しない内部エラーが発生しました。

  • String getErrorMessage()

    このメソッドは、必要に応じて、データソースまたはXQSから、エラー・メッセージを取得する場合に使用します。このメソッドでは、nullが戻されることはありません。データソースによってエラーが生成され、メッセージが戻されなかった場合は、関数でエラーが生成されたことを示す汎用メッセージが、XQSによって戻されます。

  • String getErrorCode()

    このメソッドは、データソースによって生成されたエラーについて、XQSエラー・コードの文字列を戻すために使用します。

  • String toString()

    このメソッドは、関数名、エラー・タイプ、エラー・コードおよびエラー・メッセージを組み合せて単一の文字列にするために使用します。

  • String toXMLString()

    このメソッドは、関数名、エラー・タイプ、エラー・コードおよびエラー・メッセージを組み合せてXMLエラー要素の1つの文字列表現にするために使用します。

  • public static String[] typenames

    この静的配列には、次に示すXQSエラー・タイプの文字列表現が含まれます。

    • XQSERR_MISSING_SRC

    • XQSERR_SRC_ACCESS

    • XQSERR_PARAM

    • XQSERR_SRC_ERROR

    • XQSERR_SRC_CONFIG

    • XQSERR_INTERNAL

    Javaオブジェクトのエラー・タイプがXQSErrorIの場合は、式XQSErrorI.typNames[error.getErrorType()]によって、オブジェクトのエラー・タイプに適した文字列が戻されます。

  • org.w3c.dom.Node toXMLNode()

    このメソッドは、関数名、エラー・タイプ、エラー・コードおよびエラー・メッセージをDOMノード書式で取得するために使用します。

XQS構成ファイルのリファレンス

この項では、XQS構成ファイルxqs-config.xmlの要素の説明をアルファベット順に示します。このXQS構成ファイルのXMLスキーマは、http://www.oracle.com/technology/tech/xml/xqs/xqs-config.xsdにあります。また、このファイルは、xds/samples/XQSDemo/XDS/xqs-config.xsdのXLSDemoアプリケーションでも使用可能です。データソースの各カテゴリの主要な要素の使用方法の詳細は、「XQS関数の構成方法」を参照してください。

XQSにより、アプリケーションEARファイルのトップレベルにあるxqs-resources.jarファイルのxqs-config.xmlが参照されます。XQuery式に対して宣言された各外部関数では、XQSによりxqs-config.xmlファイルの関数の構成が参照されます。

XQS構成ファイルの要素の階層を要約します。構成するそれぞれのXQS関数について、関数がアクセスするデータソースの種類に応じて、<document-source><wsdl-source>または<xqsview-source>要素を使用します。

<bind-prefix>

親要素: <xqs-config>

子要素: <use-prefix>

必須/オプション オプション。使用数: 0または1つ。

XQS構成要素内の特定のXML名前空間を表す接頭辞を指定する場合は、<use-prefix>サブ要素とともにこの要素を使用します。1つの<use-prefix>サブ要素によって、1つの接頭辞が指定されます。

<bind-prefix>要素には、属性はありません。

<cache-properties>

親要素: <document-source><wsdl-source>または<xqsview-source>

子要素: <in-memory>

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

<document-source><wsdl-source>または<xqsview-source>isCached属性を介してXQSキャッシングを有効化する場合は、<cache-properties>要素およびその必須のサブ要素<in-memory>を使用して、特定のXQS関数で使用するキャッシング・プロパティを設定します。関連する考慮事項は、「XQSキャッシングの対策」を参照してください。

isCached="false"(デフォルト)と設定されている場合、<cache-properties>要素は無視されます。

表8-4 <cache-properties>属性

名前 説明

time-to-live

値: 整数(秒単位)

デフォルト: 該当なし(必須)

項目が期限切れになるまでの、キャッシュ内での保持期間を指定します。


<dataSource>

親要素: <xqsview-source>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

この要素の値を使用して、data-sources.xml構成ファイルに定義されているデータソースのJNDI名を指定します。指定されたデータソースは、次の例に示すように、XQSによるデータベースへの接続に使用されます。

<dataSource>jdbc/OracleCoreDS</dataSource>

<dataSource>要素には、属性はありません。

<document-source>

親要素: <xqs-sources>

子要素: <cache-properties><documentURL><error-message><function-name><output-element><XMLTranslate>

必須/オプション オプション。使用数: 0以上。

構成するXQS関数のうち、ドキュメント・ソースを使用するそれぞれの関数に、<document-source>要素および(必要に応じて)そのサブ要素を使用します。

実行時にURLを使用する汎用ドキュメント・ソースの使用を構成できます。もしくは、<documentURL>サブ要素を使用して、構成内で固定URLを指定できます。(実行時にURLを使用する例は、「ドキュメント・ソースにアクセスするXQS関数の構成」を参照してください。)

XML以外のドキュメントの場合は、そのドキュメントがD3Lツールでサポートされている書式に準拠している場合は、<XMLTranslate>要素を使用してXMLへの変換を構成できます。(D3Lの詳細は、「XML以外のドキュメント・ソースを使用するための準備」を参照してください。)

表8-5 <document-source>属性

名前 説明

isCached

値: ブール

デフォルト: false

データソースから結果をキャッシュするには、trueに設定します。<cache-properties>要素の詳細は、「XQSキャッシングの構成」も参照してください。

largeData

値: ブール

デフォルト: false

大量のデータを処理するために、メモリー節約内部最適化オプションを使用するようにXQSに指示する場合は、trueに設定します。(必要な場合のみ使用してください。)「ラージ・データ用のXQSドキュメント・ソースの構成」も参照してください。

onError

値: dynamicError | emptySequence | errorMessage

デフォルト: dynamicError

XQSで使用されるエラー処理モードを決定します。「XQS関数のエラー処理の構成」を参照してください。


<documentURL>

親要素: <document-source>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

次の例のように、この要素の値を使用して、データソースとして使用するドキュメントを指定します。

<documentURL>http://host:port/xqsdemos/Repository/pos-2KB.xml</documentURL>

XML以外のドキュメントを指定する場合は、<document-source><XMLTranslate>サブ要素を使用して、XQSで使用する変換ツールを指定します。

<documentURL>要素には、属性はありません。


注意:

  • ファイアウォールを使用しており、指定したURLで外部インターネット・アクセスが要求される場合は、適切なプロキシ設定を使用してOC4Jも構成する必要があります。

  • <documentURL>要素を介してドキュメントURLを事前に定義するかわりに、この要素を省略して(構成するXQS関数に対応する)XQuery外部関数を宣言し、ドキュメントURLを実行時引数として使用できます。

  • ドキュメントURLを指定する際には、次のことに注意してください。ドキュメントがローカル・ファイル・システムにある場合は、http://プロトコルを使用するよりも、file://プロトコルを使用した方が、データの取得速度が速くなります。


<error-message>

親要素: <document-source><wsdl-source>または<xqsview-source>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

XQS errorMessageエラー・モード(<document-source><wsdl-source>または<xqsview-source>onError属性で指定)では、データソースから受け取ったメッセージをそのまま転送するかわりに固定エラー・メッセージを事前に定義する場合は、<error-message>要素を使用します。次の例のように、要素値によってメッセージが構成されます。

<error-message>No information available</error-message>

「XQSエラー処理の概要」も参照してください。

<error-message>要素には、属性はありません。

<function-name>

親要素: <document-source><wsdl-source>または<xqsview-source>

子要素: なし

必須/オプション 必須。使用数: 1つのみ。使用場所: 出現する各親要素の内部。

この要素を使用して、データソースへのアクセス用にXQSによって実装されるXQuery関数の目的の名前を宣言します。要素値は関数名で、属性の設定によって関数の名前空間が指定されます。(それぞれのXQuery関数は、いずれかの名前空間に属する必要があります。)XQuery式のデフォルトとして特定の名前空間を宣言していないかぎり、XQuery式内で関数を起動するたびに、関数の名前空間を参照する必要があります。

namespace属性を使用して名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません。必ずどちらか一方のみを使用してください。<output-element>要素の使用に関する情報は、「<output-element>を使用する際の考慮事項」を参照してください。

ここで指定する関数名は、対応するデータソースにアクセスするためにXQuery外部関数宣言で宣言する関数名です。

次に例を示します。

<function-name  namespace="http://xmlns.oracle.com/ias/xqs">
   customerInfo
</function-name>

一方、xqsがXQS名前空間の接頭辞として定義されている場合は、次のようになります。

<function-name prefix="xqs">customerInfo</function-name>

次に、前述の構成に対応する、XQuery関数の宣言の例を示します。

declare namespace xqs="http://xmlns.oracle.com/ias/xqs";
declare function xqs:customerInfo() external;

表8-6 <function-name>属性

名前 説明

namespace

値: URI

デフォルト: なし(prefixが使用されていない場合は必須)

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし(namespaceが使用されていない場合は必須)

事前定義済の接頭辞を介して名前空間を指定します。


<in-memory>

親要素: <cache-properties>

子要素: なし

必須/オプション 親要素が使用されている場合は必須。使用数: 1つのみ。

<cache-properties>要素およびそのサブ要素<in-memory>を使用して、XQSキャッシュのプロパティを設定します。<in-memory>要素の属性により、キャッシング・モードが決定されます。単純なメモリーベースのキャッシングの場合は、useSpooluseDiskCacheの両方をfalseに設定します。メモリー不足になると必要に応じてキャッシュ・データをディスクにスプールできるメモリーベースのキャッシングの場合は、useSpooltrueに設定し、useDiskCachefalseに設定します。ディスクベースのキャッシングの場合は、useDiskCachetrueに設定し、useSpoolfalseに設定します。ディスクベースのキャッシングを使用すると、サーバーに障害が発生しても、キャッシュ・データは失われません。関連する考慮事項は、「XQSキャッシングの対策」を参照してください。

必要に応じてスプーリングを使用する、メモリーベースのキャッシングの例を示します。

<cache-properties time-to-live="600">
   <in-memory useSpool="true" useDiskCache="false"/>
</cache-properties>

追加情報は、「XQSキャッシングの構成」を参照してください。

表8-7 <in-memory>属性

名前 説明

useSpool

値: ブール

デフォルト: false

スプーリングを有効化する場合は、メモリーベースのデータ・キャッシングに対してuseSpool="true"を設定します。これにより、キャッシュ・データがメモリーからディスクにスプールされるため、メモリー空間の再利用のためにキャッシュ・オブジェクトが削除されても、データは失われません。

useDiskCache

値: ブール

デフォルト: false

ディスクベースのデータ・キャッシングに対して、useDiskCache="true"を設定します。これにより、サーバーに障害が発生しても、キャッシュ・データがリカバリされます。


<input-parameters>

親要素: <wsdl-source>または<xqsview-source>

子要素: <part>

必須/オプション 必須。使用数: 1つのみ。使用場所: 出現する各親要素の内部。

この要素を使用して、関連するデータソースのXQS関数への入力パラメータを指定します。各パラメータには、<part>サブ要素を使用します。タイプ・マッチングは、WSDLソースについてのみ、type-match属性に基づきます。

この要素は、入力パラメータがない場合でも必須です。その場合は、空の要素を使用します。

表8-8 <input-parameter>属性

名前 説明

type-match

値: strict | none

デフォルト: strict

WSDLソースについて、入力パラメータに対してXQSによるタイプ・マッチングが実行されるかどうかを決定します。type-match="strict"(デフォルト)の設定を使用すると、(<part><schema-type>サブ要素を介して)指定した入力タイプが、WSDLドキュメント内の対応する部分のタイプと比較されます。現在サポートされている唯一のレベルであるstrict(厳格な)マッチングでは、タイプ名の完全一致が要求されます。実際の入力タイプが<schema-type>要素でサポートされていない場合は、サポートされている中で最も近いタイプを選択し、type-match="none"の設定を使用します。(同様に、<schema-type>要素を使用しない場合は、タイプ・マッチングを回避できます。)


<itemType>

親要素: <xquery-sequence>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

<xquery-sequence>要素を使用して、順序のタイプを(順序の各メンバーのタイプが同じ)XQSビューの入力タイプとして使用する場合は、<itemType>サブ要素を使用してメンバーのタイプを指定できます。XQSによるタイプ・チェックの実行を許可する場合に便利です。

namespace属性を使用して、型を定義する名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません。必ずどちらか一方のみを使用してください。

表8-9 <itemType>属性

名前 説明

namespace

値: URI

デフォルト: なし(prefixが使用されていない場合は必須)

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし(namespaceが使用されていない場合は必須)

事前定義済の接頭辞を介して名前空間を指定します。

location

値: URI

デフォルト: なし

ユーザー定義の型の場合は、その型を定義するスキーマがある場所のURIを指定できます。対応する、パラメータの詳細な宣言がXQueryプロローグに存在する場合は、XQSによるタイプ・チェックに役立ちます。


<mapping>

親要素: <typeMap>

子要素: <xmlType>

必須/オプション 親要素が使用されている場合は必須。使用数: 1つ以上。使用場所: 親要素の内部。

JavaまたはEJBのバインディングを伴うWSDLソースでは、<xmlType>サブ要素と併用され、Java型とXML型をマップします。typeClass属性を使用して、Java型を指定します。

表8-10 <mapping>属性

名前 説明

typeClass

値: 文字列

デフォルト: 該当なし(必須)

この属性によって、完全修飾された、XML-Java型マッピングのJavaクラス名が指定されます。このクラスは、OC4Jクラス・パスに含める必要があります。


<operation>

親要素: <wsdl-source>

子要素: なし

必須/オプション 必須。使用数: 1つのみ。使用場所: 出現する各親要素の内部。

実行するWebサービス操作の指定に使用します。指定する操作は、<wsdlURL>要素がポイントするWSDLドキュメント内で定義された操作になります。定義には、WSDLに含まれる<operation>要素のname属性に対応するXQS <operation>要素の値が使用されます。次に例を示します。

<operation>getCustomerByKey</operation>

<operation>要素には、属性はありません。

<output-element>

親要素: <document-source><wsdl-source>または<xqsview-source>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

この要素の値は、XQS関数の結果である順序の項目タイプを定義します。この要素は必須ではありませんが、この情報は、XQSによるタイプ・チェックおよび最適化に使用されます。この要素は、WSDLvisibility="true"と設定されているXQSビュー・ソースに使用することを特にお薦めします。タイプ情報がなくても、XQSでは有効なWebサービス操作が生成されますが、タイプ情報を持たないWebサービスを本番システムで定義することは好ましくありません。

結果項目の定義方法は2つあります。型による定義、および前に別のスキーマで定義された要素の参照による定義です。このようなインポート済要素の名前は、要素<output-element>のテキスト値として渡されます。たとえば、結果順序内の項目が、スキーマurn:PurchaseOrders名前空間の<po>要素になる場合、<output-element>は次のようになります。

<output-element namespace="urn:purchaseOrders" >po</output-element>

結果順序内の項目が、http://myHost:/mySchemas/PurchaseOrders.xsdにあるスキーマurn:PurchaseOrders名前空間で定義されたタイプPOTypeの要素になる場合、<output-element>は次のようになります。

<output-element prefix="po_ns"
   location="http://myHost:/mySchemas/PurchaseOrders.xsd"
   type="POType"/>

namespace属性を使用して名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません。必ずどちらか一方のみを使用してください。

次に、複合型の例を示します。

<output-element namespace="http://xmlns.oracle.com/ias/xqs/CustomerDemo"
   location="http://host:port/xqsdemos/Customers.xsd"
   type="CustomersType">
   customers
</output-element>

次に、単純型の例を示します。

<output-element prefix="xs">float</output-element>

表8-11 <output-element>属性

名前 説明

namespace

値: URI

デフォルト: なし(prefixが使用されていない場合は必須)

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし(namespaceが使用されていない場合は必須)

事前定義済の接頭辞を介して名前空間を指定します。

location

値: URI

デフォルト: なし

要素または型を定義するスキーマの場所のURIを指定します。WSDLvisibility="true"と設定されている<xqsview-source>要素内の<output-element>要素を使用する場合は、この属性は必須です。それ以外の場合は必須ではありませんが、対応する、パラメータの詳細な宣言がXQueryプロローグに存在する場合は、XQSによるタイプ・チェックに役立ちます。

type

値: 文字列

デフォルト: なし

XQS関数の結果である順序の項目タイプになる、XML型のローカル名を指定します。タイプ名の名前空間は、namespace属性またはprefix属性によって決まります。結果項目のタイプが、<output-element>要素の次の値として指定された要素名を参照して定義されている場合は、type属性は必須ではありません。


<part>

親要素: <input-parameters>

子要素: <schema-type><xquery-sequence>

必須/オプション 親要素が空の場合は必須。使用数: 入力引数ごとに1つ。

WSDLソースまたはXQSビューについて、入力パラメータごとに1つの<part>要素を使用します。属性を介して、パラメータの名前および位置(順序)を指定します。必要に応じて<schema-type>サブ要素または<xquery-sequence>サブ要素(XQSビューのみ)を使用して、タイプを指定します。タイプの指定は必須ではありませんが、指定すると、XQSによるタイプ・チェックを実行できます。

WSDLソースの場合は、ソースへのアクセスに使用するWSDL操作の入力メッセージの一部分に、各<part>要素が対応している必要があります。XQSの場合は、各<part>要素が、ビューを定義するXQueryの外部変数に対応しているか、ビューを定義するSQL問合せのバインド変数に対応している必要があります。

表8-12 <part>属性

名前 説明

name

値: 文字列

デフォルト: 該当なし(必須)

入力パラメータの名前を指定します。WSDLソースの場合は、WSDLドキュメントに含まれているものと同じ名前にする必要があります。XQSビューの場合は、外部XQuery変数の名前またはSQLバインド変数と同じにする必要があります。

position

値: 正の整数

デフォルト: 該当なし(必須)

<input-parameters>要素に含まれるすべての<part>要素の位置属性を使用して、メッセージ部分に割り当てられる入力パラメータ(WSDLソースの場合)や、外部またはバインド変数に割り当てられる入力パラメータ(XQSビューの場合)の順序が決定されます。position="1"で始まる、最も低い位置が設定されているパラメータから順に使用されます。各<part>要素には、一意の位置設定を指定する必要があります。


<port>

親要素: <wsdl-source>

子要素: なし

必須/オプション 必須。使用数: 1つのみ。使用場所: 出現する各親要素の内部。

この要素の値は、<wsdlURL>要素がポイントするWSDLドキュメント内で定義されたWebサービス・ポートの名前を指定します。この値は、WSDL内の<port>要素のname属性に対応します。

属性の設定によって名前空間が指定されますが、適用可能なサービスに1つしかポートがない場合は、名前空間を指定する必要はありません。

namespace属性を使用して名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません

例:

<port namespace="http://customer.myeis.com/">CustomerInfo</port>

別の方法の例を示します。

<bind-prefix>
   <use-prefix prefix="myeis">http://customer.myeis.com/</use-prefix>
</bind-prefix>
...
<port prefix="myeis">CustomerInfo</port>

表8-13 <port>属性

名前 説明

namespace

値: URI

デフォルト: なし

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし

事前定義済の接頭辞を介して名前空間を指定します。


<portType>

親要素: <wsdl-source>

子要素: なし

必須/オプション 必須の場合あり。使用数: 0または1。使用場所: 出現する各親要素の内部。

この要素の値は、<wsdlURL>要素がポイントするWSDLドキュメント内で定義されたWebサービス・ポートの名前を指定します。この値は、WSDL内の<portType>要素のname属性に対応します。この要素は、操作に使用するポートのバインディングがWSDLに複数含まれている場合には必須です。

属性の設定により、名前空間が指定されますが、WSDLに含まれるすべてのポート・タイプが同じ名前空間に属する場合は、名前空間を指定する必要はありません。

namespace属性を使用して名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません

例:

<portType namespace="http://customer.myeis.com/">CustomerInfoType</portType>

表8-14 <portType>属性

名前 説明

namespace

値: URI

デフォルト: なし

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし

事前定義済の接頭辞を介して名前空間を指定します。


<queryName>

親要素: <xqsview-source>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

次の例で示すように、この要素の値を使用して、XQSビューが定義されているXQuery式のテキスト・ファイル(.xqまたは.sqlファイル)の名前を指定します。

<queryName>UserByOrderNum.xq</queryName>

ファイル名の拡張子.xqまたは.sqlは、XQSによって自動的に推定されるため、指定しなくてもかまいません。XQSがファイルを検索するディレクトリは、<xqsview-source><repository>サブ要素(あるいはデフォルトの場所)に基づきます。

<queryName>要素を使用しない場合、XQSでは、XQSビュー・ファイルの名前は、<xqsview-source><function-name>サブ要素で指定した関数名と同じで、ビューのタイプに応じて拡張子は.xqまたは.sqlであるとみなされます。

<queryName>要素には、属性はありません。

<repository>

親要素: <xqsview-source>

子要素: なし

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

この要素の値は、XQSビューが定義されているXQuery式のテキスト・ファイル(.xqファイル)またはSQL問合せファイル(.sqlファイル)を含むディレクトリへの絶対パスです。<xqsview-source><queryName>サブ要素で名前を指定します。

<repository>要素を使用しない場合は、OC4JPackagerの-repositoryオプションを介して指定したディレクトリ内がXQSによって検索されます。XQSのデモ・アプリケーションのデフォルト・ディレクトリを明示的に指定する場合の例を示します。

<repository>/META-INF/xqs/mydir/</repository>

<repository>要素には、属性はありません。

<schema-file>

親要素: <XMLTranslate>

子要素: なし

必須/オプション 親要素が使用されている場合は必須。使用数: 1つのみ。

ドキュメント・ソースが、XML以外の、D3Lツールによってサポートされている書式である場合は、<XMLTranslate>要素および<schema-file>サブ要素を使用して、そのドキュメントをXMLに変換するための情報をXQSに渡します。(D3Lの詳細は、「XML以外のドキュメント・ソースを使用するための準備」を参照してください。)

<XMLTranslate>要素は、使用する変換ツール(D3L)を指定し、<schema-file>要素は、変換に使用するスキーマ・ファイルを指定します。

次に例を示します。

<documentURL>http://host:port/xqsdemos/paymentInfo.csv</documentURL>
<XMLTranslate method="D3L">
   <schema-file>http://host:port/xqsdemos/paymentInfoD3L.xml</schema-file>
</XMLTranslate>

<schema-file>要素には、属性はありません。

<schema-type>

親要素: <part>

子要素: なし

必須/オプション 説明を参照。使用数: 1つのみ。

XQSビューの各入力パラメータについて、この要素または<xquery-sequence>要素(入力順序の場合)を使用して、パラメータ・タイプを指定する必要があります。

WSDLソースの各入力パラメータでは、この要素を<part>親要素内で使用することはオプションですが、この要素は、タイプ・チェックに役立つほか、すべてのタイプのリストをXQS構成ファイルに含めるという編成上の目的にも役立ちます。(WSDLソースでは、入力順序は適用されません。)

WSDLソースでタイプ・チェックを実行するには、<input-parameters>要素の属性がtype-match="strict"と設定されている必要があります。

<schema-type>では、要素値によってタイプが指定され、属性設定によって名前空間が指定されます。namespace属性を使用して名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません。必ずどちらか一方のみを使用してください。

次に例を示します。

<input-parameters>
  <part position="1" name="empname">
    <schema-type namespace="http://www.w3.org/2001/XMLSchema">string</schema-type>
  </part>
</input-parameters>

別の方法として、xsをXML Schemaの名前空間として定義する場合の例を示します。

<bind-prefix>
   <use-prefix prefix="xs">http://www.w3.org/2001/XMLSchema</use-prefix>
</bind-prefix>
...
<input-parameters>
  <part position="1" name="empname">
    <schema-type prefix="xs">string</schema-type>
  </part>
</input-parameters>

ユーザー定義の型の場合は、次のようになります。

<input-parameters>
   <part position="1" name="DBServiceSelect_cust_id_inparameters">
      <schema-type namespace=
         "http://xmlns.oracle.com/pcbpel/adapter/db/top/TestDBAdapter">
         DBServiceSelect_cust_id
      </schema-type>
   </part>
</input-parameters>

ユーザー定義のXML型に加えて、現在、XQSでは、XQuery 1.0およびXPath 2.0データ・モデルで定義されている型のサブセット、すなわちxs:booleanxs:stringxs:intxs:longxs:floatxs:doublexs:decimalxs:base64Binaryxs:hexBinaryxs:anyURIxs:dateTimexs:durationおよびxs:anyTypeをサポートしています。(「サポートされている問合せパラメータのタイプ」も参照してください。)サポート対象外のXQuery/XPath入力タイプを使用する場合は、サポートされている中で、データに最も適したJava表現のタイプを選択し、<input-parameters>要素内でtype-match="none"の設定を使用します。(JavaまたはEJBのバインディングを伴うWSDLソースの場合、このような状況では、<wsdl-source><typeMap>サブ要素も使用します。)

表8-15 <schema-type>属性

名前 説明

namespace

値: URI

デフォルト: なし(prefixが使用されていない場合は必須)

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし(namespaceが使用されていない場合は必須)

事前定義済の接頭辞を介して名前空間を指定します。


<service>

親要素: <wsdl-source>

子要素: なし

必須/オプション 必須の場合あり。使用数: 0または1。使用場所: 出現する各親要素の内部。

この要素の値は、サービスの名前を指定します。指定するサービスは、<wsdlURL>要素がポイントするWSDLドキュメント内で定義されたサービスになります。定義には、WSDLに含まれる<service>要素のname属性に対応するXQS <service>要素の値が使用されます。XQS <service>要素は、WSDLドキュメントで複数のサービスが定義されている場合には必須です。

属性の設定により、名前空間が指定されますが、WSDLに含まれるすべてのサービス要素が同じ名前空間に属する場合は、名前空間を指定する必要はありません。

namespace属性を使用して名前空間を直接指定します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません

例:

<service namespace="http://customer.myeis.com/">CustomerInfoMYEISService</service>

表8-16 <service>属性

名前 説明

namespace

値: URI

デフォルト: なし

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし

事前定義済の接頭辞を介して名前空間を指定します。


<typeMap>

親要素: <wsdl-source>

子要素: <mapping>

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

JavaまたはEJBのバインディングを伴うWSDLソースでは、必要に応じてこの要素を使用し、XML型をJava型にマップできます。Java型は、<mapping>サブ要素を介して指定し、XML型は、<mapping><xmlType>サブ要素を介して指定します。

<typeMap>要素には、属性はありません。

<use-prefix>

親要素: <bind-prefix>

子要素: なし

必須/オプション 親要素が使用されている場合は必須。使用数: 1つ以上。

特定のXML名前空間を表す接頭辞を使用する場合は、<bind-prefix>要素および<use-prefix>サブ要素を使用します。各<use-prefix>サブ要素は、1つの接頭辞を指定します。使用される要素値は、名前空間を表す接頭辞を指定する、名前空間および接頭辞の属性を指定します。次に例を示します。

<bind-prefix>
   <use-prefix prefix="xs">http://www.w3.org/2001/XMLSchema</use-prefix>
   <use-prefix prefix="xqs">http://xmlns.oracle.com/ias/xqs</use-prefix>
   <use-prefix prefix="myeis">http://customer.myeis.com/</use-prefix>
</bind-prefix>

これらの設定により、名前空間を指定する必要があるXQS構成要素では、たとえば、namespace="http://customer.myeis.com/"のかわりにprefix="myeis"を使用できます。


注意:

<use-prefix>の指定は、XQuery式ではなく、この指定が出現するXQS構成ファイルのみで有効です。

表8-17 <use-prefix>属性

名前 説明

prefix

値: 文字列

デフォルト: 該当なし(必須)

この属性は、目的の接頭辞を指定します。


<username>

親要素: <document-source>

子要素: なし

必須/オプション オプション。使用数: 0または1つ。

この要素は、将来のセキュリティ拡張のために予約されています。

<username>要素には、属性はありません。

<wsdl-source>

親要素: <xqs-sources>

子要素: <cache-properties><error-message><function-name><input-parameters><operation><output-element><port><portType><service><typeMap><wsdlURL>

必須/オプション オプション。使用数: 0以上。

構成するXQS関数のうち、WSDLベースのソースにアクセスするそれぞれの関数に、<wsdl-source>要素および(必要に応じて)そのサブ要素を使用します。(XQSで使用できるWSDLベースのソースの種類は、「データソースのサポート対象カテゴリ」を参照してください。

表8-18 <wsdl-source>属性

名前 説明

isCached

値: ブール

デフォルト: false

データソースから結果をキャッシュするには、trueに設定します。<cache-properties>要素の詳細は、「XQSキャッシングの構成」も参照してください。

largeData

値: ブール

デフォルト: false

大量のデータを処理するために、メモリー節約内部最適化オプションを使用するようにXQSに指示する場合は、trueに設定します。(必要な場合のみ使用してください。)「ラージ・データ用のXQSドキュメント・ソースの構成」も参照してください。

onError

値: dynamicError | emptySequence | errorMessage

デフォルト: dynamicError

XQSで使用されるエラー処理モードを決定します。「XQSエラー処理の概要」を参照してください。


<wsdlURL>

親要素: <wsdl-source>

子要素: なし

必須/オプション 必須。使用数: 1つのみ。使用場所: 出現する各親要素の内部。

実行する操作を定義するWSDLドキュメントをポイントするために使用します。WSDLへのアクセスは、実行時行われます。次に例を示します。

<wsdlURL>http://api.mySearch.com/mySearch.wsdl</wsdlURL>

<wsdlURL>要素には、属性はありません。


注意:

ファイアウォールを使用しており、指定したURLで外部インターネット・アクセスが要求される場合は、適切なプロキシ設定を使用してOC4Jも構成する必要があります。

<xqs-config>

親要素: 該当なし(ルート)

子要素: <bind-prefix><xqs-sources>

必須/オプション 必須。使用数: 1つのみ。

これは、xqs-config.xmlのルート要素です。最低限必要な要素は、このルート要素、そのサブ要素<xqs-sources>、および<xqs-sources>のサブ要素(<document-source><wsdl-source><xqsview-source>)のうち少なくとも1つです。

表8-19 <xqs-config>属性

名前 説明

version

値: XMLの名前トークン(NMTOKEN

デフォルト: 1.0(現在のバージョン)

この属性は、xqs-config.xmlスキーマ定義のバージョン番号を記録します。現行のXQS実装では、デフォルト値を使用します。


<xqs-sources>

親要素: <xqs-config>

子要素: <document-source><wsdl-source><xqsview-source>

必須/オプション 必須。使用数: 1つのみ。

これは、構成される全XQS関数のソース要素の親要素です。属性はありません。

<xqsview-source>

親要素: <xqs-sources>

子要素: <cache-properties><error-message><function-name><input-parameters><output-element><queryName><repository><dataSource>

必須/オプション オプション。使用数: 0以上。

構成するXQS関数のうち、XQSビューを使用するそれぞれの関数に、<xqsview-source>要素および(必要に応じて)そのサブ要素を使用します。

表8-20 <xqsview-source>属性

名前 説明

fetchSize

値: 整数

デフォルト: 1

この属性は、リレーショナル・データベースに接続するSQLベースのXQSビューにのみ有効です。この属性はオプションです。このfetchSize属性は、java.sql.PreparedStatementsetFetchSizeメソッドへのコールに変換されます。この属性は、JDBCへのヒントとして機能します。このヒントを使用して、1回の処理でデータベースからフェッチされる結果セットの行数が定義されます。JDBCのsetFetchSizeパラメータは(つまり、XQSのfetchSize属性も)単なるヒントであり、バインディングではないことに注意してください。

isCached

値: ブール

デフォルト: false

データソースから結果をキャッシュするには、trueに設定します。<cache-properties>要素の詳細は、「XQSキャッシングの構成」も参照してください。

largeData

値: ブール

デフォルト: false

大量のデータを処理するために、メモリー節約内部最適化オプションを使用するようにXQSに指示する場合は、trueに設定します。(必要な場合のみ使用してください。)「ラージ・データ用のXQSドキュメント・ソースの構成」も参照してください。

onError

値: dynamicError | emptySequence | errorMessage

デフォルト: dynamicError

XQSで使用されるエラー処理モードを決定します。「XQSエラー処理の概要」を参照してください。

WSDLvisibility

値: ブール

デフォルト: false

アプリケーションのWebサービス・コンポーネントで、XQSをWebサービス操作として公開する場合は、これをtrueに設定します。この属性は、SQLベースのXQSビューには適用できません。「Webサービス操作として公開されたXQSビューの使用方法」も参照してください。

SQLResultType

値: relational | XMLType

デフォルト: relational

この属性は、SQLベースのビューを使用している場合にのみ適用可能です。この属性では、データベース問合せで、データをリレーショナル(表)形式またはXMLのいずれで戻すかを設定します。Oracle XMLデータベースを使用している場合は、SQLResultType属性をXMLTypeに設定することで、SQLベースのXQSビューを使用して(それ以上変換せずに)データベースからXML型の値を選択できます。また、「XQSビューを使用するXQS関数の構成」も参照してください。

rowTag

値: 文字列

デフォルト: ROW

この属性は、SQLベースのビューを使用している場合にのみ適用可能です。この属性が指定されている場合、データベースの結果のリレーショナルからXMLへの変換で使用された要素のデフォルト名は、この値で上書きされます。この属性は、SQLResultType属性がrelationalに設定されている場合にのみ適用可能です。

また、「XQSビューを使用するXQS関数の構成」も参照してください。

rowIdAttr

値: 文字列

デフォルト: NULL

この属性は、SQLベースのビューを使用している場合にのみ適用可能です。この属性が指定されている場合、結果に含まれる行要素の番号付けが制御されます。この属性は、SQLResultType属性がrelationalに設定されている場合にのみ適用可能です。

rowIdAttr属性の値は、結果の行要素の番号付け属性の名前です。行は1から開始して、123…のように番号付けされます。""の設定はデフォルトの動作と同じで、行の番号付け属性を抑止します。

rowTagおよびrowIdAttr属性は、それぞれ別々に使用されます。つまり、指定できる属性は1つのみで、もう一方にはデフォルトを使用します。

また、「XQSビューを使用するXQS関数の構成」も参照してください。

XMLFormat

値: XSU

デフォルト: XSU

この属性は、SQLベースのビューを使用している場合にのみ適用可能です。この属性の値はXSUのみです。その他の値は今後のリリースで使用できるようになり、WebRowset形式の結果がサポートされます。現行リリースの制限は、JDK 1.5機能への依存性が原因です。


<XMLTranslate>

親要素: <document-source>

子要素: <schema-file>

必須/オプション オプション。使用数: 0または1。使用場所: 出現する各親要素の内部。

ドキュメント・ソースが、XML以外の、D3Lツールによってサポートされている書式である場合は、<XMLTranslate>要素および<schema-file>サブ要素を使用して、そのドキュメントをXMLに変換するための情報をXQSに渡します。この要素は、Excelのカンマ区切り(CSV)ファイルなど、別の書式のファイルをXMLに変換する場合に便利です。D3Lの詳細は、「XML以外のドキュメント・ソースを使用するための準備」を参照してください。

<XMLTranslate>method属性は、使用する変換ツールを指定します。現在、XQSでサポートされているのは、D3L変換ツールです。

<schema-file>サブ要素は必須で、変換に使用するスキーマを指定します。

表8-21 <XMLTranslate>属性

名前 説明

method

値: D3L

デフォルト: 該当なし(必須)

XQSで使用する変換ツールを指定します。XQSで現在サポートされているのは、D3Lです。


<xmlType>

親要素: <mapping>

子要素: なし

必須/オプション 必須。使用数: 1つのみ。使用場所: 出現する各親要素の内部。

JavaまたはEJBのバインディングを伴うWSDLでは、<mapping>親要素と併用され、Java型とXML型をマップします。属性設定を使用してXML型の名前空間を指定します。名前空間を直接指定する場合は、namespace属性を使用します。すでに、<bind-prefix>要素を介して名前空間の接頭辞を定義している場合は、prefix属性をショートカットとして使用します。namespaceおよびprefixを同時に使用することはできません。必ずどちらか一方のみを使用してください。

<mapping>親要素は、Java型を指定します。

次に例を示します。

<typeMap>
   <mapping typeClass="org.w3c.dom.Node">
      <xmlType prefix="myeis">Customer</xmlType>
   </mapping>
   ...
</typeMap>

表8-22 <xmlType>属性

名前 説明

namespace

値: URI

デフォルト: なし(prefixが使用されていない場合は必須)

名前空間を直接指定します。

prefix

値: 文字列

デフォルト: なし(namespaceが使用されていない場合は必須)

事前定義済の接頭辞を介して名前空間を指定します。


<xquery-sequence>

親要素: <part>

子要素: <itemType>

必須/オプション 親要素またはXQSビューが出現するたびに、その内部でこの要素または<schema-type>を使用する必要があります。使用数: 1つのみ。

XQSビューの、パラメータ・タイプがXQuery/XPath順序の入力パラメータごとに、<part>親要素内でこの要素を使用して、タイプを指定する必要があります(これに対して、順序以外のタイプには、<schema-type>要素が使用されます)。

WSDLソースでは、入力順序がサポートされていないため、この要素は関係ありません。

<xquery-sequence>要素は、複数のタイプの項目を含む異機種間の順序に使用できます。その場合は、この要素を空にする必要があります。もしくは、<itemType>サブ要素を含めて、異機種間順序の各メンバーの共通タイプを指定できます。

<xquery-sequence>要素には、属性はありません。

OC4JPackagerのリファレンス

この項では、XQSのパッケージ化ユーティリティであるOC4JPackagerのパラメータおよびプロパティに関するリファレンス・ドキュメントを提供します。概要は、「OC4JPackagerの概要」を参照してください。使用方法は、「OC4JPackagerを使用したXQSアプリケーションのパッケージ方法」を参照してください。


注意:

パラメータまたはプロパティの設定でパスを指定する際に使用できるように、OC4JPackagerでは、現在のディレクトリへの相対パス(ディレクトリ表記の「.」および「..」の使用を含む)または絶対パスがサポートされています。

OC4JPackagerのパラメータ

この項では、アルファベット順に、OC4JPackagerのパラメータの説明および使用例を示します。OC4JPackagerは、次のように実行します(%はコマンド・プロンプトです)。

% java -jar OC4JPackager.jar -option1 value1 -option2 value2 ... -optionN valueN

appArchives

必須。ディレクトリ・パスを指定します。

アプリケーションの場所を指定するために使用します。アプリケーションの場所は、EARファイルが含まれているディレクトリ、またはEAR構造のトップレベル・ディレクトリです。

-appArchives /dir1/myappdir

help

オプション。これは、切替えフラグです。

OC4JPackagerの使用状況およびパラメータ・リストを示すために使用します。その際、その他のパラメータは使用しません。

-help

jsp

オプション(XQS JSPタグ・ライブラリを使用する場合は必須)。これは、切替えフラグです。

XQS JSPタグ・ライブラリのJARファイル(xquerytaglib.jar)を出力EARファイルに含めるために使用します。

-jsp

name

必須。EARファイルの名前を指定します。

出力EARファイルの目的の名前(.ear拡張子の有無は任意)を指定するために使用します。このファイルの場所は、-outputパラメータによって決まります。

-name myxqsapp.ear

no_ws

オプション。これは、切替えフラグです。

Webサービスを生成しないようにする場合に使用します。

-no_ws

output

必須。ディレクトリ・パスを指定します。

OC4JPackagerによって作成されるEARファイルの配置場所を指定するために使用します。ファイル名は、-nameパラメータに基づきます。

-output /dir1/mydeployments

repository

オプション。ディレクトリ・パスを指定します。

XQSビューが格納されるXQSリポジトリの場所を指定するために使用します。

-repository ORACLE_HOME/xds/samples/repository

sf

オプション(XQSステートフルEJBクライアントAPIを使用する場合は必須)。これは、切替えフラグです。

XQSステートフルEJBクライアントのJARファイル(xqsclient-stateful.jar)を出力EARファイルに含めるために使用します。

-sf

また、これにより、次の<module>要素がapplication.xmlファイルに追加されます。

<module>
   <ejb>xqsclient-stateful.jar</ejb>
</module>

sl

オプション(XQSステートレスEJBクライアントAPIを使用する場合は必須)。これは、切替えフラグです。

XQSステートレスEJBクライアントのJARファイル(xqsclient-stateless.jar)を出力EARファイルに含めるために使用します。

-sl

また、これにより、次の<module>要素がapplication.xmlファイルに追加されます。

<module>
   <ejb>xqsclient-stateless.jar</ejb>
</module>

xqsConfigFile

必須。ファイルのパスを指定します。

アプリケーションに対して、XQS構成ファイルxqs-config.xmlのパス(ファイル名を含む)を指定するために使用します。

-xqsConfigFile /dir1/subdir/myconfigdir/xqs-config.xml

OC4JPackager用のJavaプロパティ

この項では、アルファベット順に、OC4JPackagerでサポートされているJavaプロパティの説明および使用例を示します。Java -Dオプションは、次のように使用します。

java -Dproperty1=value1 -Dproperty2=value2 -jar OC4JPackager.jar \
     -option1 value1 -option2 value2 ... -optionN valueN

oracle.home

オプション。ディレクトリ・パスを指定します。

OC4JPackagerでは、Oracleホーム・ディレクトリを指定するためのoracle.homeがサポートされています。例:

-Doracle.home=/myroot/myoraclehome

Oracleホーム・ディレクトリを指定すると、-jsp-sfおよび-slの各フラグを介して要求されたクライアントJARファイルの検索、およびこれらのファイルのアプリケーションへのバンドルが可能になります。oracle.homeを設定しない場合は、これらのフラグが無視されます。

java.home

必須。ディレクトリ・パスを指定します。

OC4JPackagerが作業(JARファイルのバンドル解除やバンドルなど)のためにjavaコマンドを実行する、Javaホーム・ディレクトリへのパスを指定します。

-Djava.home=/dir1/myjavahome

このプロパティを指定しない場合、OC4JPackagerは終了します。

java.util.logging.properties.file

オプション。ファイルのパスを指定します。

Javaロギング・プロパティを指定するファイルへのパス(ファイル名を含む)を示すために使用します。次の例では、myfile.propertiesが現在のディレクトリにあります。

-Djava.util.logging.properties.file=myfile.properties

ロギング・プロパティ・ファイルを指定しない場合は、Javaエラーの出力を確認できません。

OC4JPackagerでは、次の場所で示されるように、標準のJ2SEロギング・フレームワークを使用して、メッセージがログに記録されます。

http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/

OC4JPackagerにより、プロパティ・ファイル内では、OC4JPackagerからのメッセージのロギング・レベルを指定できるプロパティoracle.xds.tools.OC4JPackager.levelがサポートされています。指定できるレベルは、SEVEREWARNINGINFOまたはFINEです。高レベルの進捗メッセージにはINFO、低レベルのデバッグ・メッセージにはFINEを使用します。

メッセージをコンソールに送り、OC4JPackagerからのメッセージにINFOレベルを使用する場合の、ロギング・プロパティ・ファイルのエントリの例を示します。

#  output to console
handlers= java.util.logging.ConsoleHandler
...
# set packager level to INFO
oracle.xds.tools.OC4JPackager.level=INFO

xds.packager.work.dir

オプション。ディレクトリ・パスを指定します。

これを使用して、EARファイルのバンドル解除および再作成の際にOC4JPackagerが使用する、作業ディレクトリを指定します。

-Dxds.packager.work.dir=/some/dir

デフォルトの場所は、user.homeディレクトリです。

XQSのトラブルシューティング

この項では、OC4Jロギングを有効化する方法を説明し、XQSアプリケーションに関する様々なトラブルシューティングのヒントを提供します。

OC4Jロギングの有効化

Javaプロパティjava.util.logging.properties.fileを使用して、OC4Jロギングを有効化し、ロギング・プロパティ・ファイルを指定できます。このファイルでは、OC4JPackagerのロギング・レベルを含む、Javaロギング設定を指定できます。ロギング・プロパティは、次の場所で指定されているように、標準のJ2SEロギングによって定義されます。

http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/

ロギングの詳細は、「java.util.logging.properties.file」『Oracle Containers for J2EE構成および管理ガイド』の「OC4Jでのロギング」、および『Oracle Containers for J2EE開発者ガイド』のロギング実装のガイドラインを参照してください。

XQSの主な兆候、原因および処置

この項では、XQSアプリケーションで発生する潜在的な問題およびその解決方法を説明します。


注意:

XQS実装には、ダイナミック・モニタリング・サービス(DMS)のメトリックは含まれていません。

大量のデータによる問題 サイズの大きいXML文書をメモリーにロードできない場合は、largeDataフラグを有効化すると処理が可能になることがあります。「ラージ・データ用のXQSドキュメント・ソースの構成」を参照してください。

XQS関数が正常にロードされない: 次のような内容のエラー・メッセージが表示されます(ここで、arityは関数が取る引数の数を表し、nsおよびfuncnameは関数の名前空間および名前に置き換えられます)。

XP0017: It is a static error if the expanded QName and number of arguments in a 
function call do not match the name and arity of an in-scope function in the 
static context. Detail: unknown function 'ns:funcname'

重要なのは、XQueryによって関数が認識されなかったということです。これは、関数が正しく構成されていなかったために、関数がXQSによって正常にロードされなかった可能性があることを示しています。OC4Jエラー・ログ・ファイル(ORACLE_HOME/j2ee/home/log/oc4j/log.xmlなど)で、この関数で発生した問題の詳細な説明を検索してください。

外部関数に一貫性のないシグネチャが存在する: 次のようなエラーが発生したとします。

external function "Foo" has inconsistent signatures: the one defined in function
library framework is different from the one declared in function declaration
prolog

XQSとの関係において、function library framework(関数ライブラリ・フレームワーク)という用語は、XQS構成ファイルの<input-parameters>要素内で定義されたシグネチャを表すことに注意してください。<input-parameters>要素の下にある<part>定義は、必ずXQueryプロローグ内の関数のシグネチャと一致する必要があります。

XQueryシグネチャを構成と一致させることができない場合は、使用するXML型がサポートされていない可能性があります。(「サポートされている問合せパラメータのタイプ」を参照してください。)対応策として、XQueryパラメータまたはXQueryの戻り値について、プロローグでの型の宣言をすべて回避できます。たとえば、次のように完全に型が指定された関数の宣言があるとします。

declare function xqs:Foo ($s as element()) as xs:positiveInteger external;

型を指定せずにこの関数を宣言するには、次のようにします。

declare function xqs:Foo ($s) external;

ただし、XQS構成を介して、入力パラメータの数を常に指定する必要があります。

XQSの例

XQSの例は、Oracle Technology Networkの次のWebサイトで、XQSを検索してください。

http://www.oracle.com/technology/tech/java/oc4j/1013/how_to/index.html