この章の内容は次のとおりです。
XQueryマッパーはXQuery 1.0をサポートします。古いXQuery 2004もサポートされます。
XQueryマッパーには次のビューがあります。
XQueryマッパーのグラフィカル・ビュー
XQueryマッパーのソース・エディタ
注意:
XQueryマッパーのグラフィカル・ビューは、XQuery 2004ファイルではサポートされていません。XQueryのこの古いバージョンでは、ソース・ビューのみがサポートされています。
新規XQueryファイルを作成すると、デフォルトではグラフィカル・ビューで開きます。グラフィカル・ビューには、XQueryマップ下部の「XQueryマッパー」タブをクリックしてアクセスすることもできます。
図41-1 は、XQueryマッパーのグラフィカル・ビューを示しています。
XQueryマッパーの左ペインには、XQuery関数の入力元やパラメータが表示されます。XQueryファイルに複数の関数がある場合、マッパー・ペインの上のツールバーを使用して関数を選択して表示できます。
右ペインには、XQuery関数の結果タイプに対応するターゲット・スキーマ・ツリーが表示されます。中央のペインは、XQuery関数を使用したソースおよびターゲット・スキーマ要素のマッピングに使用できます。
XQueryマッパーの左ペインにはソース・ツリー、右ペインにはターゲット・ツリーが表示されます。ツリーのノードは、XML要素、属性、および他のなんらかのXQueryコンストラクトとなります。
XML要素は<>アイコンで示されます。属性には別のアイコンが使用され、XPath式で表されるのと同様に、属性名の先頭に@記号が付きます。要素または属性の多重度は、次の標準接尾辞で示されます。
?: 0個または1個の要素/属性があります。
+: 1個以上の要素/属性があります。
*: 0個以上の要素/属性があります。
ソース・ツリーは、選択されたXQuery関数の入力元またはパラメータを示します。ルート・レベルの要素は、その関数の入力パラメータを表します。ルート・ノードが複合要素の場合、子要素および属性がルート・ノードの下に表示されます。
ターゲット・ツリーには、XML要素、属性、およびいくつかのプログラミング・コントロール構造を含めることが可能です。要素および属性は、次の形式で表示されることがあります。
グレー表示のフォント: ターゲット・スキーマの一部で、未定義の要素。グレー表示の要素をソース要素にマッピングすると、その後は通常のフォントで表示されます。
通常のフォント: ソース内の要素コンストラクタに対応するか、またはソース・データから明示的にコピーされた要素。
下線付きフォント: 指定されたターゲット・スキーマに互換性のない要素。この要素は、要素コンストラクタで使用される要素名が正しくないため、またはシーケンス割当てのスキーマ・タイプが正しくないために表示される場合があります。
ターゲット・ツリーには、If-Then-Else、union演算子、comma演算子などのプログラミング・コントロール構造を含めることができます。
If-Then-Else演算子: If-Then-Else演算子は、「条件付き」というノードとして表示されます。「条件付き」ノードには、If Then and Elseのネストされたブランチがあります。ノードのコンテキスト・メニューから「条件付け」オプションを選択して、ノードを条件付きにすることが可能です。
union演算子(およびその他のシーケンス結合演算子): これらはXQueryマッパーのグラフィカル・ビューでは作成できません。ただし、ソース・ビューにこうした演算子が含まれる場合は、ターゲット・ツリーに「すべて」というノードで表示され、オペランドがすべてのノードのサブノードとして表示されます。
comma演算子: comma演算子は、「リスト」というノードとして表示されます。サブノードは、comma演算子のカンマ区切りオペランドを表します。ターゲット・ツリー・ノードのコンテキスト・メニューから「クローン」オプションを選択して、comma演算子を適用できます。
XQueryマッパー・ツールバーはXQueryマッパーのペインの上にあります。このツールバーには、グラフィカル・マッパーで使用できる様々なツールが含まれています。XQueryマッパー・ツールバーを図に示します。
XQueryマッパー・ツールバーには次のツールが含まれています。
関数セレクタ: 「関数セレクタ」ボックスは、fの文字が付いた緑色のアイコンで示されます。関数セレクタを使用して、ソース・ペインに表示する関数を選択できます。これは、XQueryマップに複数の関数が含まれる場合に役立ちます。
新規関数の追加: 「新規関数の追加」ボタンは、緑色のプラス(+)記号で表示されます。新規関数の追加を使用して、XQueryマップ・ファイルに新規関数を追加します。
関数の名前変更: 「関数の名前変更」ボタンは「新規関数の追加」ボタンの右にあります。「関数の名前変更」を使用して、XQueryマップ・ファイルの関数の名前を変更します。
関数の削除: 関数の削除は、赤色のクロス(X)記号で表示されます。「関数の削除」を使用して、XQueryマップ・ファイルから関数を削除します。
ライブラリ・モジュールのインポート: 「ライブラリ・モジュールのインポート」ボタンは「関数の削除」ボタンの右にあります。「ライブラリ・モジュールのインポート」を使用して、ライブラリXQuery関数をマップにインポートします。インポートするライブラリ・モジュール・ファイルを指定する必要があります。
マッピング・モード: XQueryマッパーでは様々なマッピング・モードを使用できます。これらのモードは、ユーザーがソース・ノードからターゲット・ノードに線をドラッグ・アンド・ドロップする際に作成されるXQuery式に影響します。次の3つのボタンを使用して、対応するマッピング・モードを選択します。
値マッピング: 入力ソースからターゲットのXML要素および属性を構成し、XMLコンストラクタを使用して入力ソースの値をコピーします。次に例を示します。
<ID>{fn:data($pParam1/ID)}</ID>
前述のコードは、入力ソース・パラメータのID
要素からターゲットのID
要素を作成します。
値マッピングは、デフォルトのマッピング・モードです。
マッピングの上書き: 入力ソース・パラメータのXML要素が結果シーケンスにコピーされます。既存のマッピングは新規マッピングに置き換えられます。次に例を示します。
{
$pParam1/Items
}
前述のコードは、Itemsサブツリーおよび、その子要素と属性をターゲット・ツリーにコピーします。
マッピングの追加: このモードは、既存のマッピングが上書きされない点を除いて、マッピングの上書きと同様に動作します。新しく追加するマッピングが作成されます。
マッピング・モードの使用方法の詳細は、「XQueryマッパーの使用」を参照してください。
ターゲット・タイプ差異の表示/非表示: 「ターゲット・タイプ差異の表示/非表示」ボタンを使用して、右側のターゲット・ツリーでXML要素および属性が表示されるかどうかを管理します。まだマッピングされていない要素および属性は非表示にする選択ができます。
検索: 「検索」フィールドを使用して、ソース・ツリーおよびターゲット・ツリーで要素、属性、データ・タイプなどを検索します。上矢印および下矢印を使用して、それぞれ次および前の項目を探します。
「プロパティ」ウィンドウには、ターゲット・ツリーで選択したノードのXQuery式が表示されます。ドラッグ・アンド・ドロップを使用して作成されたXQuery式は、「プロパティ」ウィンドウで編集できます。「プロパティ」ウィンドウは、さらに複雑なXQuery式の作成にも使用できます。
「プロパティ」ウィンドウは、デフォルトではXQueryマッパーの下にあります。「プロパティ」ウィンドウが表示されていない場合は、JDeveloperの「ウィンドウ」メニューで「プロパティ」をクリックして、「プロパティ」ウィンドウを表示します。
ヒント:
XQueryマッパーを使用する際は、「プロパティ」ウィンドウを画面右下隅から、画面下部のマッパー・ウィンドウのすぐ下に移動できます。「プロパティ」ウィンドウが大きくなり、XQuery式の編集および変数ツリーが表示しやすくなります。
選択したターゲット・ノードのXQuery式は、「プロパティ」ウィンドウで直接編集できます。また、XQuery関数、コンストラクトおよび演算子を、「コンポーネント」ウィンドウから「プロパティ」ウィンドウのXQuery式にドラッグできます。「コンポーネント」ウィンドウは、デフォルトではXQueryマッパーの右側にあります。「コンポーネント」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「コンポーネント」の順に選択します。
変更内容を保存するには、「プロパティ」ウィンドウの左上隅にある「コミット」ボタンをクリックします。XQueryが再コンパイルされ、XQueryマッパー・ビューが更新されます。
XQuery式の編集で間違えた場合は、「プロパティ」ウィンドウの左上領域にある「マッパー・リソースに戻す」をクリックして、変更内容を元に戻して再度開始します。
「プロパティ」ウィンドウの左側にも変数ツリーがあります。変数ツリーには、すべての変数、ローカル変数およびXQuery関数パラメータの両方が表示され、現在のスコープで確認できます。このスコープは、ターゲット・ツリー・ペインでハイライトされたノードによって決まります。変数ツリーから右側のペインにあるXQuery式にノードをドラッグ・アンド・ドロップできます。
図41-3 に、「プロパティ」ウィンドウを示します。「プロパティ」ウィンドウは赤でハイライト表示されています。このコメント・ノードは、ターゲット・ツリーで選択されて表示されます。対応する変数ツリーおよびXQuery式(fn:data($pParam1/Comment)
)が「プロパティ」ウィンドウに表示されます。
「コンポーネント」ウィンドウには、XQueryマップで使用できるすべてのXQuery関数および演算子が含まれています。これらの関数および演算子は、XQueryマッパーの中央ペインにドラッグ・アンド・ドロップできます。また、ターゲット・ツリー・ノードが「挿入」コンテキスト・メニュー・オプションを使用してすでに作成されている場合は、ターゲット・ツリー・ノードに関数をドラッグ・アンド・ドロップできます。
注意:
また、前述の項の説明に従って、「プロパティ」ウィンドウのXQuery式に、関数および演算子をドラッグ・アンド・ドロップできます。
たとえば、関数はソース・ノードおよびターゲット・ノード間の既存のリンクにドラッグ・アンド・ドロップされると、そのリンクに対応する式の一部となります。パラメータを持たない一部の関数は、中央ペインの空白の領域にドラッグして、ターゲット・ノードと関連付ける必要があります。関数は、相互に連鎖させることもできます。
「コンポーネント」ウィンドウでは、XQuery関数および演算子を次のカテゴリにまとめています。
XQuery関数: 集計関数、日付関数、数学関数、文字列関数など、様々なカテゴリのXQuery関数が含まれます。
XQueryコンストラクト: If-Then-ElseやFLWORコンストラクトなど、標準のXQueryコンストラクトが含まれます。
XQuery演算子: 論理演算子、ノード比較演算子など、様々なカテゴリのXQuery演算子が含まれます。
ユーザー定義関数: 現在のXQueryマップ・ファイルで定義したすべての関数と、インポートされたライブラリ・モジュールのすべての関数が含まれます。
コンポーネント: このカテゴリに追加できるお気に入りのコンポーネントが含まれます。最近使用した関数も含まれます。
ソース・エディタでは、XQueryマップを直接編集でき、グラフィカル・ビューで直接実行できないタスクも実行できます。
XQueryマッパー・グラフィカル・ビューの左下にある「XQueryソース」タブをクリックして、ソース・エディタを表示します。図41-4 に、XQueryマッパーのソース・エディタを示します。
XQueryソース・ビューには、コード強調表示、コード補完、エラー強調表示、コード折りたたみなどのコード編集機能が用意されています。また、[Ctrl]キーを押しながら関数名、変数名、スキーマまたはスキーマ要素をクリック([Ctrl]キーを押し下げた状態で左マウス・ボタンをクリック)して、その関数、変数、スキーマまたはスキーマ要素それぞれに対応する宣言に移動することもできます。
Oracle JDeveloperを使用してXQueryマップを作成します。XQueryマップは、.xqyファイルとしてプロジェクトに含まれています。
XQueryマップは、メイン・モジュールおよびライブラリ・モジュールとして作成できます。メイン・モジュールは、XQueryの実行可能ファイルです。ライブラリ・モジュールは、XQuery関数のグループ化および格納に使用されます。ライブラリ・モジュールをメイン・モジュールにインポートすると、ライブラリ・モジュール内のすべての関数がメイン・モジュールで使用可能になります。
XQuery関数を既存のXQueryマップに追加できます。「コンポーネント」ウィンドウには、ソース・エディタまたはXQueryマッパーの中央ペインにドラッグ・アンド・ドロップできるXQuery関数のリストが含まれています。
また、「コンポーネント」ウィンドウには、一連のXQueryコンストラクト(FLWORなど)およびXQuery演算子(論理ANDなど)も含まれています。これらのコンストラクトおよび演算子は、ソース・エディタにのみドラッグおよびドロップできます。
「コンポーネント」ウィンドウからXQueryマッパーの中央ペインにXQuery関数をドラッグ・アンド・ドロップできます。
「コンポーネント」ウィンドウが表示されていることを確認します。デフォルト位置はOracle JDeveloperの右上隅です。
「コンポーネント」ウィンドウが表示されていない場合、「ウィンドウ」メニューから「コンポーネント」を選択します。
「コンポーネント」ウィンドウで、「XQuery関数」ページを選択します。
関数を含める「カテゴリ」をクリックします。たとえば、concat関数を追加するには「文字列関数」をクリックします。
「コンポーネント」ウィンドウからXQueryマッパーの中央ペインに目的の関数をドラッグします。関数を中央ペインにドラッグすると、移動に伴って、関数の出力が様々なターゲット・ノードに接続されます。
図41-9 は、XQueryマッパーの中央ペインにドラッグされた関数を示しています。
関数出力が目的のターゲット・ノードに接続されていることを示すときに、関数を中央ペインにドラッグします。
注意:
XQueryマッパーの中央ペインで、既存のマップ線に関数をドロップすることもできます。
この関数は、ソース(入力)とターゲット(出力)の両方のノードに接続されます。
関数に追加の入力パラメータが必要な場合は、関数アイコンに警告アイコンが表示されます。ソース・ノードから関数の左端に線をドラッグして、入力パラメータを指定します。
入力パラメータとして追加する必要のあるソース・ノードがまだある場合は、前述の手順を繰り返します。
中央ペインで関数アイコンをクリックします。関数に対応する式が「プロパティ」ウィンドウに表示されます。
「プロパティ」ウィンドウは、デフォルトではOracle JDeveloperの右下隅にあります。「プロパティ」ウィンドウが表示されない場合は、「ウィンドウ」メニューの「プロパティ」をクリックすると、「プロパティ」ウィンドウが表示されます。オプションで、「JDeveloper」ウィンドウ内の使いやすい場所に「プロパティ」ウィンドウをドラッグする選択ができます。また、「プロパティ」ウィンドウは必要に応じてサイズを変更できます。
「プロパティ」ウィンドウの右側のペインに表示された式を編集します。
「プロパティ」ウィンドウの左側のペインには、現在のスコープで表示可能なすべての変数が含まれた変数ツリーが表示されます。右側の式に変数をドラッグ・アンド・ドロップすることで、関数定義の作成が容易になります。
「プロパティ」ウィンドウの左上隅にある「コミット」をクリックして、変更内容を保存します。または、「マッパー・リソースに戻す」をクリックして、「プロパティ」ウィンドウで行った変更を元に戻します。
「XQueryメイン/ライブラリ・モジュールの作成方法」では、ライブラリ・モジュール・ファイルの作成プロセスについて説明しています。ライブラリ・モジュールを使用するには、ライブラリ・モジュールをメイン・モジュールにインポートできます。これによって、ライブラリ・モジュールのすべての関数がメイン・モジュールで使用できるようになります。
ソース・ビューで、FLWOR (For、Let、Where、Order By、Return)式を作成できます。FLWOR式は、XQueryマッパーのターゲット・ツリーでゾーンとして表示されます。
ゾーンは、FLOWRコンストラクトまたはIf-Then-Else条件付きコンストラクトに関連付けられているターゲット・ツリーの領域を識別します。ゾーンは、ターゲット・ツリーの左側に黄色の大カッコで表示されます。
ゾーンを表す黄色の線にマウスを合せると、線が青色に変わります。FLWORゾーンでは、For-Let句、Where句およびOrder By句に対応した追加のボタンが表示されます。図41-10 に、ゾーンが表示されたXQueryのサンプルを示します。
XQueryが実行されると、XQueryエンジンによって、XQueryを実行する前にXQueryファイル内のスキーマ・タイプの検証が実行されます。これによって、一部のアプリケーションでパフォーマンスのオーバーヘッドが発生する場合があります。
パフォーマンスのためにXQuery関数を最適化する必要がある場合は、タイプ注釈を使用してXQueryファイルでスキーマ情報を指定します。タイプ注釈を使用すると、スキーマ・タイプの定義をXQuery実行エンジンから隠すことができます。スキーマ定義はXqueryマッパーには表示されるため、XQueryマップを通常どおりに編集できます。
XQueryファイルでタイプ注釈を使用するには、新しいXQueryファイルの作成時に、「XQueryマップ・メイン・モジュールの作成」/「XQueryマップ・ライブラリ・モジュールの作成」ダイアログで「スキーマ・タイプ注釈の使用」を選択します。XQueryファイルの作成の詳細は、「XQueryメイン/ライブラリ・モジュールの作成方法」を参照してください。
XQueryファイルのタイプ注釈は、標準のXQueryコメントのように表示されます。標準のXQueryコメントは、カッコとコロンで区切られますが、タイプ注釈では、カッコと二重コロンが使用されます。そのため、次のようになります。
(: This is an XQuery comment :) (:: This is a type annotation ::)
タイプ注釈を使用するXQueryファイルには、ファイルの最初のバージョン宣言の直後に次のようなバージョン注釈があります。
(:: OracleAnnotationVersion "1.0" ::)
次の例では、いくつかのXQueryコンストラクトをタイプ注釈のあるものとないもので比較します。
スキーマのインポート(タイプ注釈なし):
import schema namespace ns1="http://www.oracle.com/pcbpel/po" at "../Schemas/PurchaseOrder.xsd";
スキーマのインポート(タイプ注釈あり):
declare namespace ns1="http://www.oracle.com/pcbpel/po"; (:: import schema at "../Schemas/PurchaseOrder.xsd" ::)
変数宣言(タイプ注釈なし):
declare variable $test_param as schema-element(ns1:PurchaseOrder) external;
変数宣言(タイプ注釈あり):
declare variable $test_param as element() (:: schema-element(ns1:PurchaseOrder) ::) external;