データ サービス開発者ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

XQuery エディタの操作

BEA Aqualogic Data Services Platform サービスは、利用可能なデータへのアクセスや変換に使用する関数を作成および管理するためのフレームワークを提供します。 これらの関数は、XQuery エディタを使用して作成できます。

有効なクエリ関数には、必ず戻り値の型が関連付けられています。 ソース ビューには、各関数の戻り値の型が記述されています。 通常、それらの戻り値の型は、データ サービスの形式を定義する XML 型 (スキーマ) と一致します。

作成したクエリ関数は、クライアント アプリケーションから呼び出すことができます。 AquaLogic Data Services Platform の関数を呼び出すさまざまな方法については、AquaLogic Data Services Platform の『クライアント アプリケーション開発者ガイド』を参照してください。

XQuery エディタを使用して、テスト ビューで実行できるスタンドアロンのクエリを作成することもできます (「クエリ関数のテストとクエリ プランの表示」を参照)。

この章の内容は以下のとおりです。

 


XQuery エディタの役割

XQuery エディタを使用すると、直感的なドラッグ アンド ドロップ操作でクエリ関数を作成できます。 関数の作成中は、エディタとソース ビューを簡単に切り替えることができます。

図 6-1 XQuery エディタでパラメータ化した関数の例

XQuery エディタでパラメータ化した関数の例

XQuery エディタでは、メタデータのデータ サービス関数を使用してさまざまなデータ型を表現します (メタデータのインポートの詳細については、「エンタープライズ メタデータの取得」を参照)。

XQuery エディタでパラメータ化した関数の例

データ サービスは、物理データ ソースを表現する場合と、それ以前に作成された論理データ ソースを表現する場合があります。 データ サービス関数およびカスタム XQuery ライブラリ関数は、どちらもデータ サービス パレットから表現できます (図 6-2)。データ サービス パレットは、XQuery エディタ ビューがアクティブになっているときに使用できる WebLogic Workshop ペインです。

図 6-2 RTL サンプル アプリケーションで使用できるデータ サービス関数

RTL サンプル アプリケーションで使用できるデータ サービス関数

図 6-2 には、2 種類の関数表現が表示されています。緑色のまっすぐな矢印で示されている関数は「読み取り関数」です。一方、青色の変形した矢印で示されている関数は「ナビゲーション関数」です。

クエリ関数は、基本的には次の手順で作成します。

このようにグラフィカルにクエリ関数を作成すると、ソース ビューに XQuery が自動的に作成されます。

クエリ関数を作成したら、テスト ビューを使用して実行できます (「クエリ関数のテストとクエリ プランの表示」を参照)。 クエリ関数を実行すると、基底のデータ ソースへのアクセスが行われて結果が表示されます。 適切なパーミッションがある場合は、クエリの実行後にデータを直接更新することもできます。

データ ソースの表現

ソースのメタデータ表現は、データ サービス パレットから XQuery エディタにドラッグ アンド ドロップできます。 データ サービス パレットには、使用できるデータ サービスと、その読み取り関数および関係関数が一覧表示されます。 このような関数はすべて、XQuery エディタの作業領域にドラッグすると for 句に変換されます。

読み取り関数と Web サービスは、多くの場合入力パラメータを取ります。 たとえば、論理データ サービス Customer (customer.ds) は、XQuery エディタではその読み取り関数 getCustomer() および getPaymentList( ) で表現されます。 データ サービス パレットから XQuery エディタに getCustomer(  ) 項目をドラッグすると、作業領域に図 6-3 のようなソース表現が表示されます。

図 6-3 データ サービス パレットからドラッグしたデータ サービス関数

必要に応じて、物理データ ソースや論理データ ソースの表現をクエリ内で複数回使用することもできます。

物理および論理データ サービスの作成については、「エンタープライズ メタデータの取得」および「データ サービスの設計」を参照してください。

XQuery エディタのオプション

データ サービスで新しい関数を作成して関数名をクリックすると、その関数が自動的に XQuery エディタに表示されます (図 6-1 を参照)。 別の方法として、[XQuery エディタ ビュー] タブをクリックし、ドロップダウン メニューから関数を選択することもできます。 初期状態の XQuery には戻り値の型しか定義されていませんが、これによりそのデータ サービスが XML 型に関連付けられているものと見なされます (「XML 型を関連付ける」を参照)。

図 6-4 XQuery エディタの右クリック メニュー オプション

XQuery エディタの右クリック メニュー オプション

作業領域の空いている部分を右クリックすると、さまざまな右クリック メニュー オプションを使用できます。

表 6-5 XQuery エディタの右クリック メニュー オプション
オプション
説明
[ソース ビューで編集]
ソース ビューを開き、現在選択されている関数の場所を表示する。
[デフォルト レイアウト]
既定の形式に従って、XQuery エディタ内の要素を整理する。戻り値の型は、作業領域の右端に表示される。
[パラメータの追加]
単純型または複合型のパラメータを作業領域に追加する。 複合パラメータの場合は、スキーマ ファイルとグローバル タイプを選択する必要がある。 「パラメータ ノード」を参照。
[条件行の表示]
条件を示す行 (where 句の述語など) の表示/非表示を切り替える。 デフォルトでは、すべての条件行が表示される。
[選択された項目の削除]
選択されている項目を作業領域から削除する。
[すべてを折りたたむ]
作業領域内のすべてのノード (戻り値の型を含む) を折りたたむ。
[すべてを展開]
作業領域内のすべてのノードを展開する。

 


単純なデータ サービス関数の作成

この節では、データ サービスを作成する手順について説明します。データ サービスを作成することで、XQuery エディタの操作を体感でき、データ サービスのさまざまな側面を理解できます。

ヒント : XQuery エディタに加えた変更は、直ちにソース ビューに反映されます。

この演習の目的は、XQuery エディタを使用して、論理データ サービスとその XML 型をすばやく作成することです。 基本的な手順は次のとおりです。

ヒント : XQuery エディタでの操作を元に戻したい場合は、[編集|元に戻す] コマンド (または〔Ctrl〕+〔Z〕) を使用するのが最も簡単な方法です。 アプリケーションを保存する前であれば、それまでの操作を無制限に元に戻すことができます。 ほとんどの場合、マッピング、ゾーン設定、条件などを描画し直すよりも、[元に戻す] コマンドを使用することをお勧めします。

以下の説明では、RTLApp サンプルとそのサーバがインストールおよび実行されていることを前提としています。

物理データ ソースからメタデータをインポートする

この節では、新しいデータ サービス対応プロジェクトを作成し、論理データ サービスで使用する予定のデータ ソースのメタデータをインポートします。

  1. RTLApp で、新しいデータ サービス プロジェクトを作成します。 プロジェクトに「myLogicalDS」という名前を付けて [作成] をクリックします (AquaLogic Data Services Platform プロジェクトおよびアプリケーションの作成方法については、「AquaLogic Data Services Platform ベースの BEA WebLogic アプリケーション」を参照)。
  2. 新しく作成したデータ サービスを右クリックし、[ソース メタデータのインポート] を選択します (ldplatform サンプル サーバをまだ実行していない場合は、この時点で起動する必要があります)。
  3. データ ソースの種類として [関係演算子] を選択して [次へ] をクリックします。
  4. 使用できるリレーショナル データ ソースのドロップダウン リストから cgDataSource を選択します。
  5. デフォルトの [すべて選択] ラジオ ボタンを選択したままにして [次へ] をクリックします。
  6. RTLCUSTOMER データベースから CUSTOMER テーブルを選択します。
  7. このテーブルを選択済みデータベース オブジェクトとして追加します。
  8. 手順 6 ~ 7 を繰り返して、RTLAPPLOMS データベースの CUSTOMER_ORDER テーブルを追加します。
  9. 以降は、すべてデフォルト オプションのままでウィザードを最後まで完了します。2 つの新しいデータ ソースが作成されます。

論理データ サービスを作成する

この節では、クライアント アプリケーションから顧客注文情報を取得するために使用する論理データ サービスを作成します。 基本的な手順は次のとおりです。

詳細な手順は次のとおりです。

  1. myLogicalDS プロジェクトを右クリックして [新規作成|データ サービス] を選択します。
  2. データ サービスに「myLogicalDS」という名前を付けて [作成] をクリックします。
  3. 注意 : この時点のデータ サービスには XML 型 (スキーマ) は定義されていません。
  4. 新しく作成したデータ サービスのタイトルバーを右クリックし、[関数の追加] を選択します。 新しい関数に「CustOrder」という名前を付けます。 関数に付けた新しい名前をクリックして XQuery エディタを表示します。
  5. [データ サービス パレット] の ApparelDB フォルダにある CUSTOMER_ORDERS データ サービスから CUSTOMER_ORDER( ) 関数をドラッグし、XQuery エディタの作業領域にドロップします (図 6-6)。
  6. [データ サービス パレット] の CustomerDB フォルダにある CUSTOMER データ サービスから CUSTOMER( ) 関数をドラッグし、XQuery エディタの作業領域にドロップします。
  7. 図 6-6 2 つのデータ サービスと空の戻り値型を含む XQuery エディタ


    2 つのデータ サービスと空の戻り値型を含む XQuery エディタ

    戻り値の型に空の要素が 2 つあることから、未完成の for 句が 2 つあることが分かります ($CUSTOMER および $CUSTOMER_ORDER)。

    次に、関数の戻り値の型を設定する必要があります。 CUSTOMER_ORDER を CUSTOMER の子として設定することで、次のような形式で情報が返されるようにします。

    Customer1
    ..
      Order1
    ..
     Order2
    ..
    Customer2
    ..
  8. 〔Ctrl〕を押しながら、CUSTOMER for ノード内の CUSTOMER* 要素を、戻り値型内の最上位の空要素にマップします。
  9. 図 6-7 CUSTOMER for ノードを誘導マッピングした後の戻り値型


    CUSTOMER for ノードを誘導マッピングした後の戻り値型

  10. 戻り値型内の新しい CUSTOMER ルート要素を右クリックし、[複合マッピングの展開] を選択します。 これにより、CUSTOMER ノード内のすべての要素が、戻り値型の対応する要素にマップされます。
  11. 返されるドキュメントに、特定の顧客に関連付けられたすべての顧客注文が一覧表示されるようにするには、従属複合要素を作成する必要があります。 1 つの方法としては、次の手順に示すように、CUSTOMER_ORDER 型を CUSTOMER の従属要素として追加します。

  12. 〔Shift〕+〔Ctrl〕を押しながら、$CUSTOMER_ORDER for ノード内のルート要素をドラッグし、戻り値型内の CUSTOMER ルートにドロップします。
  13. 図 6-8 $CUSTOMER_ORDER から戻り値型へのマッピングの追加


    $CUSTOMER_ORDER から戻り値型へのマッピングの追加

    CUSTOMER_ORDER 要素が、CUSTOMER の従属要素になります (図 6-9)。

    図 6-9 戻り値型に追加された従属ノード


    戻り値型に追加された従属ノード

    この時点でクエリを実行すると、以下の理由で失敗します。

    • データ サービスに XML 型 (XDS ファイル) が関連付けられていない。
    • 適切な SDO インフラストラクチャを作成するには、プロジェクト (またはアプリケーション) をビルドする必要がある。
    • 2 つのデータ ソース表現内の顧客 ID キーを接続する where 句が作成されていない。
    • ドキュメントのマスター/詳細構造が作成されていない。
    • 同様に、CUSTOMER_ORDER にソース要素をマップしようとしてもマップできません。 これは、複合要素のマッピングでは、すべての子要素が戻り値の型にマップされていることが暗黙的に想定されているためです。

      これらの問題は、次の手順を実行することで解決できます。

  14. CUSTOMER_ORDER ノードの「ゾーン」アイコン (図 6-10 を参照) をドラッグし、戻り値型内の CUSTOMER_ORDER 要素にドロップします (このとき、マウス ポインタが CUSTOMER_ORDER ノードの上に来ると、従属する CUSTOMER_ORDER ノードのみが強調表示されます)。 これにより、戻り値型内に内部ゾーンが作成され、これがソースではクエリの内部 for 句になります。 内部ゾーンは、リレーショナル マスター/詳細順序の「詳細」部分に相当します (戻り値型のゾーンの詳細については、「戻り値型にゾーンを設定する」を参照)。
  15. 図 6-10 CUSTOMER_ORDER をサポートするゾーンの作成


    CUSTOMER_ORDER をサポートするゾーンの作成

  16. CUSTOMER_ORDER を右クリックし、[複合マッピングの展開] を選択します。これにより、個々の要素がマップされます。
  17. CUSTOMER ノードの CUSTOMER_ID 要素を CUSTOMER_ORDER ノードの C_ID にドラッグして、2 つのデータ ソース表現の間の結合を作成します。 2 つの要素を接続する緑色の点線が描画されます。
  18. XQuery エディタの作業領域に追加されたデータ サービス関数にはネームスペースがあります。 戻り値型内のすべての要素で同じネームスペースを共有する必要があるため、少し編集する必要があります。 2 番目の複合要素 (CUSTOMER_ORDER) をダブルクリックし、
  19. ns0:customer

    を次のように変更します。

    customer

完成させる

この時点で、新しいスキーマの名前とデータ サービスの名前が一致しました。デフォルトのネームスペースは、戻り値型のルート要素の「修飾名 (qname)」です。

  1. 戻り値型のタイトルバーをクリックし、右クリック メニューから [XML 型の保存および関連付け] を選択します。 この操作を完了するには、新しいスキーマ ファイルの場所、そのネームスペース、および戻り値型のルート要素の名前を指定する必要があります。 これらの項目については、図 6-11 のようにデフォルト値が自動的に入力されます。
  2. 図 6-11 [XML 型の保存および関連付け] ダイアログ


    [XML 型の保存および関連付け] ダイアログ

  3. 新しい XML 型の自動入力された修飾ネームスペースは CUSTOMER データ サービスの修飾名と同じであるため、ネームスペースまたはルート名を変更しないと型の衝突が発生します。 「CUSTOMER」を「CUST_ORDER_DETAIL」に変更してから [OK] をクリックします (これにより、戻り値型のルート名も変更されます)。
  4. デザイン ビューを開き、 XML 型が定義されていることを確認してください。
  5. プロジェクト (またはアプリケーション) をビルドします。
  6. [テスト ビュー] を使用してクエリを実行します。 実行結果では、顧客注文が顧客別にネストされています (結果の一部を図 6-12 に示します)。
  7. 図 6-12 テスト結果


    テスト結果

ここまでの作業は、いくつかの別の手順でも実現できます。 重要な点は、クエリまたは戻り値型が完全に形成されていないために、アプリケーションを正常にビルドまたはデプロイできなくなるポイントがいくつかあることです。 したがって、各手順を順番どおりに実行することが重要です。

 


クエリ関数の作成の主要な概念

この節では、以下の用語と概念について説明します。

データ ソース

AquaLogic Data Services Platform では、以下を始めとするさまざまなデータ ソースがサポートされています。

これらのソースから AquaLogic Data Services Platform ベースのプロジェクトにデータ ソース メタデータをインポートする方法については、「エンタープライズ メタデータの取得」を参照してください。

ソース スキーマと戻り値型

XQuery エディタでは、XML スキーマ表現を以下として使用します。

詳細については、「XML 型と戻り値型」を参照してください。

XQuery エディタのコンポーネント

XQuery エディタでは、グラフィカルに表現された以下のような句や関数を組み合わせることで、クエリ関数をグラフィカルに構築できます。

以下の節では、これらの XQuery 句について、XQuery エディタでの表示に基づいて説明します (AquaLogic Data Services Platform で使用する XQuery エンジンの詳細、およびソース ビューでの XQuery の使用方法については、AquaLogic Data Services Platform の『XQuery 開発者ガイド』を参照してください。 このマニュアルには、最新の XQuery W3C 仕様のリファレンスも含まれています)。

戻り値型ノード

クエリ関数は、常に単一の戻り値型にマップします。 データ サービスを戻り値型に関連付けると、その型が [戻る] ノードに表示されます。

図 6-13 戻り値型の例

戻り値型の例

戻り値型は、以下をサポートするために拡張された XML 型と考えることができます。

戻り値型内の単純な要素をクリックすると、その要素のコンストラクタの式が表示されます。

for 句ノード

for 句ノードは、名前付きの XQuery for 句コンストラクトを表します。 for 句ノードおよび let 句ノードは、必ずデータ サービス関数に基づいています。

図 6-14 for 文ノードの例

for 文ノードの例

デフォルトでは、データ サービスを XQuery エディタの作業領域に追加すると、そのデータ サービスが for ノードで表現されます。 通常、for ノードは、次のどちらかを使用してクエリ関数をループさせることを表します。

パラメータ化された入力

for ノードは、パラメータ化されたクエリ関数を表現し、入力と出力両方のセクションを提供します。 通例どおり、パラメータは入力要素にマップされ、出力要素は他のノードへの入力または戻り値型として機能します。

図 6-15 パラメータ化された for ノードの例

	パラメータ化された for ノードの例

for ノードと let ノードのオプション

表 6-16 に、for ノードまたは let ノードのタイトルバーを右クリックすると表示されるオプションをまとめます。

表 6-16 for ノードと let ノードの右クリック オプション
オプション
説明
[名前変更]
ノードの名前を変更するためのダイアログを表示する。 名前にスペースを含めることはできない。
[削除]
ノードを作業領域から削除する。ノードのすべてのマッピング (入力および出力) も削除される。
[let 句に変換] または [for 句に変換]
句を for から let (または let から for) に変更する。 この操作は、双方向に実行できる。
[定義へ移動]
ノードによって表現されているデータ サービスを開く。 データ サービスが開かれ、XQuery エディタ ビューに現在の関数が表示される。 ただし、その関数が物理データ サービスを表現する (つまり、ソース ビューでいう「外部関数」である) 場合は、その関数定義がソース ビューに表示される。 [前へ] ボタンを使用すると、元のデータ サービスに戻ることができる。
[関係関数]
そのデータ サービスに関連付けられている関係関数の一覧が表示される。 関係関数を選択すると、その for ノードまたは let ノードを関係の入力として機能させることができる。 詳細およびサンプル コードについては、「既存のデータ サービスに関係関数を追加する」を参照。
[ソースの表示]
現在選択しているノードの基底のソースを表示する。

for 句と let 句の間の変換

for 句と let 句 (「let 文ノード」を参照) の多くの機能には互換性があります。

次のコードは、DataServices/RTLServices/Case/getCaseByCustID() 関数式の for 句です。

declare function ns1:getCaseByCustID($cust_id as xs:string) as element(ns0:CASE)* {
for $x0 in ns1:getCase()
where $cust_id eq $x0/CustomerID
return $x0
};

これを let 句に変換すると次のようになります。

declare function ns1:getCaseByCustID($cust_id as xs:string) as element(ns0:CASE)* {
let $x0 := ns1:getCase()
where $cust_id eq $x0/CustomerID
return $x0
};

let 文ノード

let 句は、ノード内でグラフィカルに表現されている要素のシーケンスを変数にバインドし、FLWR 式で使用できるようにします。

for 句で使用できるオプションは let 句でも使用できます。 「for ノードと let ノードのオプション」を参照してください。

図 6-17 RTLServices/OrderSummaryView データ サービスの let 文

RTLServices/OrderSummaryView データ サービスの let 文

let 句を解釈するときには、代入文字列 (:=) を「バインド」と読み替えることができます。 たとえば、次の let 句を見てみます。

let $x := (1, 2, 3)

これは、「変数 x を項目 1、2、および 3 で構成されるシーケンスにバインドする」と解釈できます。

for 句と let 句の間の変換」も参照してください。

パラメータ ノード

パラメータ ノードを使用すると、for 句や let 句にパラメータを関連付けることができます。 パラメータ ノードは、XQuery エディタの作業領域で作成します (図 6-4)。 右クリック オプションとしては、[名前変更]、[削除]、および [ソースの表示] を使用できます。

図 6-18 XQuery エディタの [パラメータの追加] ダイアログ ボックス

XQuery エディタの [パラメータの追加] ダイアログ ボックス

単純なデータ要素から非常に複雑な要素まで、さまざまなパラメータを作成できます。

単純型を求めるパラメータを追加する

単純型のパラメータを作成するには、ドロップダウン リストから型を選択して [OK] をクリックします。

図 6-19 単純型パラメータの設定

単純型パラメータの設定

入力セクションのある for ノードや let ノードにパラメータを「マップ」するという動作によって、パラメータ化されたクエリを作成し、さらに where 条件を設定していることになります。 図 6-20 では、custID string パラメータを ADDRESS ノード内の要素にドラッグしています。その結果、where 句によってパラメータが関連付けられます。

図 6-20 for ノードにマップされたパラメータ

for ノードにマップされたパラメータ

次に、これに対応するソース ビュー コードを示します。custID パラメータは太字で示されています。

declare function ns5:getCaseView($custID as xs:string) as element(ns6:CaseView) {
<ns6:CaseView>
{
<CASE_VIEW>
<CASES>{
for $Case in ns7:getCaseByCustID($custID)
return <CASE>
<CaseID> {fn:data($Case/CaseID)} </CaseID>
<CustomerID>{fn:data($Case/CustomerID)}</CustomerID>
<CaseType> {fn:data($Case/CaseType)} </CaseType>
<ProductID> {fn:data($Case/ProductID)} </ProductID>
<Status> {fn:data($Case/Status)} </Status>
<StatusDate> {fn:data($Case/StatusDate)} </StatusDate>
</CASE>
}
</CASES>
</CASE_VIEW>
}
</ns6:CaseView>
};

このような関数をアプリケーションから呼び出すとき (またはテスト ビューで実行するとき) には、そのパラメータの値を指定することになります。

複合パラメータを追加する

複合パラメータは、スキーマ ファイルとグローバル要素を指定して作成します。 一部のスキーマには、グローバル要素を 1 つしか指定できません。

図 6-21 複合型パラメータの設定

複合型パラメータの設定

作成したパラメータは、どの for ノードまたは let ノードにも関連付けることができます。 「パラメータ化された入力」も参照してください。

パラメータ ダイアログを使用して where 句を作成する

パラメータ ダイアログを使用すると、単純型または複合型のパラメータを for 句または let 句内の要素にドラッグするだけで where 句条件を作成できます。 図 6-22 では、新たに作成したパラメータ productID を PRODUCT_ID にマップしています。$PRODUCT for ノードが選択されているため、where 句がスコープに含まれています。

図 6-22 パラメータ化された where 句

パラメータ化された where 句

既存のデータ サービスに関係関数を追加する

既存のデータ サービスに関係関数を追加する方法はいくつかありますが、 その中でも for ノードまたは let ノードの右クリック メニュー オプションを使用する方法をお勧めします。この方法だと、単純にデータ サービス パレットから作業領域に関係関数をドラッグする方法に比べ、より適切にネストされた句を作成できます。

たとえば、顧客注文と注文明細を結合して論理データ サービスを作成する場合は、まず顧客注文を作成してから、それに関係する注文明細データを追加できます。

図 6-23 では、先に作成した RTLApp DataServices/ApparelDB/CUSTOMER_ORDER() 関数に、関係する getCUSTOMER_ORDER_LINE_ITEM() 関数を追加しています。

図 6-23 関係関数の追加

関係関数の追加

この関数のソースは、最初は次のようになっています。

declare function tns:newFunction() as element(ns30:CUSTOMER_ORDER9)* {
  for $CUSTOMER_ORDER in ns28:CUSTOMER_ORDER()
    return $CUSTOMER_ORDER
};

これに関係関数を追加すると次のようになります。

declare function tns:newFunction() as element(ns30:CUSTOMER_ORDER9)* {
  for $CUSTOMER_ORDER in ns28:CUSTOMER_ORDER()
   for $CUSTOMER_ORDER_LINE_ITEM in    ns28:getCUSTOMER_ORDER_LINE_ITEM($CUSTOMER_ORDER)
  return $CUSTOMER_ORDER
}
;

なお、この例を完了するには、関係するデータ サービスから戻り値型に要素を追加し、適切にマッピングおよび変換を行う必要があります。

group by 文ノード

group by ノードは、0 個以上のグループ化式で構成される単一の group by 句を表します。 group by ノードの最上部には、生成された group by 式で使用できる変数を定義します。 最下部には、グループ化式自体を定義します。

通常、group by 式は集約関数 (たとえば、売上金額別に顧客をグループ化する関数) で使用します。 for 句および let 句では、複数の group by 要素を使用できます。

group by ノードを生成するには、for 句または let 句のいずれかの要素を右クリックして [Group By の作成] を選択します。

図 6-24 group by 式の作成

group by 式の作成

図 6-24 のようにすると、出力が C_ID (顧客 ID) 要素別にグループ化されます。 GroupBy ノードが作成されると、ターゲット オブジェクト (たとえば戻り値型) へのマッピングは新しいノード経由で行われます。

図 6-25 顧客 ID 別に注文総額を集計する場合

顧客 ID 別に注文総額を集計する場合

group by ノードのデフォルト名は、その for ノードまたは let ノードのローカル名に基づくユニークな名前です。 CUSTOMER_ORDER for 句は、CUSTOMER_ORDER_group0 の基盤になります。 group by ノードの名前を XQuery エディタから変更することはできません。

図 6-25 に示すように、すべてのノード マッピングは自動的に group by ノードに転送されます。

以上の結果、ソースは次のようになります。

declare function tns:getCustomerOrderAmount() as element(ns5:CUSTOMER_ORDER)* {
for $CUSTOMER_ORDER in ns6:CUSTOMER_ORDER()
group $CUSTOMER_ORDER as $CUSTOMER_ORDER_group by $CUSTOMER_ORDER/C_ID as $C_ID_group

return
<ns5:CUSTOMER_ORDER>
<ORDER_ID></ORDER_ID>
<C_ID>{fn:data($C_ID_group)}</C_ID>
<ORDER_DT></ORDER_DT>
<SHIP_METHOD_DSC></SHIP_METHOD_DSC>
<HANDLING_CHRG_AMT></HANDLING_CHRG_AMT>
<SUBTOTAL_AMT></SUBTOTAL_AMT>
<TOTAL_ORDER_AMT>{fn:sum($CUSTOMER_ORDER_group/TOTAL_ORDER_AMT)}</TOTAL_ORDER_AMT>
<SALE_TAX_AMT></SALE_TAX_AMT>
<SHIP_TO_ID></SHIP_TO_ID>
<SHIP_TO_NM></SHIP_TO_NM>
<BILL_TO_ID></BILL_TO_ID>
<ESTIMATED_SHIP_DT></ESTIMATED_SHIP_DT>
<STATUS></STATUS>
<TRACKING_NO?></TRACKING_NO>
</ns5:CUSTOMER_ORDER>
};

group by ノードを削除した場合、親ノードからのマッピングはすべて描画しなおす必要があります。

複数の group by 要素を作成する

この例に別のグループ化式を追加するには、新しい要素をドラッグして「By」セパレータの上にドロップします (図 6-26)。

図 6-26 2 つ目の group by 要素の追加

2 つ目の group by 要素の追加

既存の group by 式に要素をドラッグするという動作によって、図 6-27 のように 2 つ目の group by 式が追加されます。

図 6-27 新しい group by 式要素

この例では、2 つ目の group by を追加したことで、顧客のステータス値別に注文総額がグループ化されるようになりました。

<ORDER_ID/>
<C_ID>CUSTOMER0</C_ID>
<TOTAL_ORDER_AMT>1173.2</TOTAL_ORDER_AMT>
<STATUS>CLOSED</STATUS>
</ns0:CUSTOMER_ORDER5>
<ns0:CUSTOMER_ORDER5 xmlns:ns0="ld:DataServices/ApparelDB/CUSTOMER_ORDER5">
<ORDER_ID/>
<C_ID>CUSTOMER0</C_ID>
<TOTAL_ORDER_AMT>436.3</TOTAL_ORDER_AMT>
<STATUS>OPEN</STATUS>
</ns0:CUSTOMER_ORDER5>
<ns0:CUSTOMER_ORDER5 xmlns:ns0="ld:DataServices/ApparelDB/CUSTOMER_ORDER5">
<ORDER_ID/>
複数のグループ ノードを使用する

複数の group by 式を追加して、次のようなロジックを作成することもできます。

A でグループ化し、さらに
 B でグループ化する

そのためには、別の for 句または let 句を作成し、このロジックをサポートするための親子構造を設定する必要があります。

第 2 レベルの group by を作成するには、次の手順に従います。

  1. 子となる for 句を作成します。 第 1 レベルの group by ノードのルート要素を右クリックし、[For 句の作成] を選択します。
  2. 戻り値型に新しいゾーンを設定します (「戻り値型にゾーンを設定する」を参照)。 ゾーンを設定する方法はいくつかありますが、 その中の 1 つが子要素を追加する方法です。
  3. 新しく作成した子要素を右クリックし、[ゾーンとしてマーク] を選択します。
  4. 新しい for 句のゾーンを新しい子要素に設定します。 そのためには、ゾーン アイコンをドラッグして新しい子要素の上にドロップします。 newChildElement に配列記号が表示されたら、ゾーンは正しく設定されています。
  5. NewChildElement * empty

    また、新しい子要素は、マウスでポイントすると強調表示されます。これは、その子要素自体がゾーンであることを示します。

  6. 新しい for 句ノード内のグループ化要素を右クリックしてグループを作成します。
  7. 〔Ctrl〕を押しながら、その group by 要素をドラッグし、新しい子要素の上にドロップして子要素を置換します。 これにより、この要素が group by 式によって上書きされます。
  8. 新しい戻り値型の保存と関連付けを行います。これにより、戻り値型がデータ サービスの XML 型になります。

テスト ビューを使用すると、以上の作業の結果を検証できます。

distinct by 文ノード

distinct by ノードは、単一の distinct by 句を表します。

distinct by は以下の場合に便利です。

条件の設定

for 句や let 句には、さまざまなタイプの条件をグラフィカルに適用できます。 条件を作成するには、XQuery エディタの作業領域の最下部に表示される多機能エディタを使用します (図 6-28)。

図 6-28 多機能条件エディタ

多機能条件エディタ

for ノードまたは let ノードに制約を追加したり、追加した制約を変更したりするには、そのノードを選択してから多機能エディタ内の任意の場所をクリックします。 選択した式以外のすべてのアーティファクトがグレー表示になります。これは、それらのアーティファクトが使用不可になったことを示します。

条件としては以下があります。

図 6-29 に、多機能エディタの詳細を示します。このエディタは、以下のような機能を備えています。

XQuery 関数パレットの関数は、多機能エディタにドラッグ アンド ドロップしてから編集できます。

図 6-29 多機能エディタの詳細

多機能エディタの詳細

where 句

where 句を使用すると、for 句や let 句に条件を配置できます。 where 句は別の FLWR 式を含む任意のクエリ式です。 通常、where 句は FLWR ループでの一致数をフィルタ処理します。

where 句の一般的な用途の 1 つは、2 つのソース間の結合を指定することです。 たとえば、次のクエリを見てみます。

<results> 
{
for $x in (1, 2, 3), $y in (2, 3, 4)
where $x eq $y
return
<matches>{$x}</matches>
}
</results>

このクエリの where 句は、for 句に指定された 2 つのシーケンスと一致する結果をフィルタ処理 (または結合あるいは制限) します。 この例では 2 と 3 が一致するので、クエリは次の結果を返します。

<results>
<matches>2</matches>
<matches>3</matches>
</results>

これを XQuery エディタで実現するには、where 条件を適用する for 句または let 句を選択し、 where 条件のフィールドに次のように入力します。

$x eq $y

要素の名前を直接入力しても、要素を作業領域のノードから多機能エディタにドラッグしても構いません。

eq XQuery 演算子は、直接入力するか、条件演算子のポップアップ リストから選択できます (図 6-30).

図 6-30 条件演算子の選択リスト

条件演算子の選択リスト

次に、XQuery 関数を使用したより複雑な例を示します (「XQuery 関数の使用」を参照)。 この例では、名前が「Jack」の顧客をすべて検索します。

フィルタ処理機能として where 句を使用する

次の例では、多機能エディタで where 句を使用する方法を示します。

  1. RTLApp サンプル アプリケーションの DataServices プロジェクトを使用して、新しいデータ サービスを作成します。 データ サービスには任意の名前を付けてください。
  2. [データ サービス] メニューから [関数の追加] オプションを選択します。 関数にも任意の名前を付けてください。
  3. 新しく作成した関数の名前をクリックして XQuery エディタを表示します。
  4. [データ サービス パレット] の CustomerDB/CUSTOMER データ サービスから CUSTOMER() 関数をドラッグし、XQuery エディタの作業領域にドロップします (データ サービス パレットは、[表示|ウィンドウ|データ サービス パレット] で表示できます)。
  5. 〔Ctrl〕を押しながら、最上位ノードの CUSTOMER 要素を戻り値型の空要素にマップします。これにより、空の戻り値型に CUSTOMER 要素が関連付けられます。
  6. 戻り値型の最上位の要素 (この時点では CUSTOMER) を右クリックし、メニューから [複合マッピングの展開] を選択します。
  7. 戻り値型のタイトルバーを右クリックし、メニューから [XML 型の保存および関連付け] を選択します。
  8. 戻り値型をデータ サービスに関連付けることで、新しいデータ サービスの有効な XML 型 (スキーマ ファイル) を作成できます。 同じ物理データ サービスに基づく CUSTOMER という名前のスキーマがすでに存在するため、戻り値型のグローバル要素の名前、またはそのネームスペースに割り当てられているエリアス、あるいはその両方を変更する必要があります (保存と関連付けの詳細については、「単純なデータ サービス関数の作成」を参照)。

    [名前] フィールドを CUSTOMER から CUSTOMER_WHERE に変更して [OK] をクリックすると、戻り値型内の複合要素の名前が変更されます。

  9. Customer ノードのタイトルバーをクリックします。 これにより、多機能エディタがアクティブになります。
  10. [Where 句の追加] アイコンをクリックします (図 6-29)。 where 句のフィールドが表示されます。
  11. CUSTOMER ノードの FIRST_NAME をクリックします。
  12. 等号演算子と「Jack」を追加して、句全体を次のようにします。
  13. $CUSTOMER/FIRST_NAME eq "Jack"

    無効な式を入力すると、その句が赤色で表示されます。

  14. テスト ビューに切り替えて新しい関数を実行します。 結果を見て、設定した where 条件が適用されていることを確認します。

パラメータ ダイアログを使用して where 句を作成する」も参照してください。

order by 句

order by 句は、所定のデータ セットの出力順序を示します。

特に指定されていない場合、データは XML ツリーの順序で出力されます。 これを「ドキュメント順」と呼びます。 order by キーワードは、指定した要素の昇順でデータを並び替えることを示します。

XQuery キーワードとしては、descending などがサポートされます。 たとえば、姓の降順で顧客を並べ替えるための XQuery を記述できます。

for $customer in document('customers.xml')//顧客
order by last_name descending
return
<customer>
{$customer/first_name}
{$customer/last_name}
</customer>
...

これを XQuery エディタで実現するには、order by 条件を適用する for 句または let 句を選択し、order by フィールドに次のように入力します。

last_name descending

要素の名前を直接入力しても、要素を作業領域から多機能エディタ (図 6-29) にドラッグしても構いません。

結合条件を作成する

結合条件は、where 句内で同等関係として表現します。 したがって、eq 関数を [条件] タブの行にドラッグ アンド ドロップし、2 つのソース要素/属性を同じ行にドラッグ アンド ドロップすることで同等関係を作成することもできます。

XQuery 関数の使用

AquaLogic Data Services Platform には、あらゆる組み込み XQuery 関数が用意されています。 XQuery 関数パレットのほとんどの XQuery 関数は、W3C によってサポートされている標準の XQuery 関数です。 その他に、いくつかの BEA 固有の関数と、XQuery 言語の拡張も含まれています (1.0 XQuery エンジンの BEA 実装の詳細については、『XQuery 開発者ガイド』を参照してください。 標準の XQuery 関数の詳細については、W3C の XQuery 1.0 and XPath 2.0 Functions and Operators 仕様を参照してください)。

XQuery 関数パレットの関数は、for 句や let 句の周囲に条件を作成する際に便利です。 XQuery 関数は、以下のようなさまざまなコンテキストで使用できます。

where 句で XQuery 関数を使用する

クエリから返された顧客をフィルタ処理する where 句条件を作成するには、次の手順に従います。

  1. フィルタ処理機能として where 句を使用する」の手順 1 ~ 7 を実行します。
  2. CUSTOMER ノードのタイトルバーをクリックします。
  3. [Where 句の追加] アイコン (「where 句」を参照) をクリックし、新しい where 条件を作成します。
  4. XQuery 関数パレットを開きます ([表示|ウィンドウ|XQuery 関数パレット])。
  5. [XQuery 関数パレット] の [文字列関数] にある fn:string-length() as xs:integer 関数をドラッグし、where 条件にドロップします。
  6. 図 6-31 XQuery 関数パレット


    XQuery 関数パレット

  7. 条件と式の組み込みライン エディタで、関数の引数 ($arg) を選択して強調表示にします。
  8. $CUSTOMER/LAST_NAME をクリックします。 文字列は次のようになります。
  9. Where fn:string-length($CUSTOMER/LAST_NAME)
  10. 述語として「<5」を追加します。文字列は次のようになります。
  11. Where fn:string-length($i/ORDERID)<5
    図 6-32 XQuery 関数の編集


    XQuery 関数の編集

  12. エディタの緑色のチェックマーク ボタンをクリックします。
  13. for 句のタイトルバーをマウスでポイントすると、このフラグメントが条件に関連付けられたことを確認できます。 ソース ビューでもこの変更を確認できます。

    図 6-33 ノードのタイトルバーをポイントするとその条件が表示される


    ノードのタイトルバーをポイントするとその条件が表示される

    この関数を実行すると、LAST_NAME が 5 文字未満のレコードのみが表示されます。

通常、自動型キャストを使用すると、関数とマッピングで使用される入力パラメータを、それらが使用される関数に対応した型に変換できます。

XQuery 関数を使用してデータを変換する

XQuery 変換関数も数多く用意されています。 次の例では、concat() 関数を使用して、関数によって返される要素を式に関連付ける機能を追加することで、物理データ サービスから多彩なデータをすばやく返せるようにします。

  1. フィルタ処理機能として where 句を使用する」の手順 1 ~ 7 を実行します。
  2. XQuery 関数パレットを開きます。
  3. 戻り値型に子要素を追加します。
  4. 子要素の名前を「NAME_ID_STATEMENTSTATUS」に変更します。 この時点で、この要素にはどの型も割り当てられていません。 型は、この要素にマップする要素または関数から派生します。
  5. 新しく作成した要素をクリックします。
  6. 多機能エディタの式フィールドをクリックします。
  7. [XQuery 関数パレット] の [文字列関数] にある fn:concat($arg1,$arg2,...) 関数を、式フィールドにドラッグ アンド ドロップします。
  8. 図 6-34 戻り値型内の連結要素の作成


    戻り値型内の連結要素の作成

  9. 1 番目の引数 ($arg1) を選択して強調表示にし、$CUSTOMER ノードの FIRST_NAME をクリックします。 同様に、2 番目の引数を選択して LAST_NAME をクリックします。 引数の後ろの省略記号 (...) を選択して ONLINE_STATEMENT をクリックします。
  10. concat() 関数では、すべての入力パラメータを string 型にする必要があります。 ONLINE_STATEMENT の型は short ですので、これを string としてキャストする必要があります。 この変更はエディタで直接編集できます。 また、スペースや簡単な凡例を追加して読みやすくすることもできます。
  11. これらの編集が完了すると、XQuery 関数は次のようになります。

    {fn:concat( $CUSTOMER/FIRST_NAME, '  ',$CUSTOMER/LAST_NAME,' | ',($CUSTOMER/ONLINE_STATEMENT cast as xs:string),' (online=1; printed=0)')}
  12. 緑色のチェックマーク ボタンをクリックして、編集内容を保存します。
  13. 戻り値型のスキーマに変更を加えたため、アプリケーションを再ビルドする必要があります。
  14. また、新しい機能がソース/ターゲット マッピングにどのように反映されているかも確認してください (図 6-35 を参照)。

    図 6-35 戻り値型に対する関数を含む要素を追加した後の XQuery エディタの作業領域


    戻り値型に対する関数を含む要素を追加した後の XQuery エディタの作業領域

  15. このプログラムをテスト ビューで実行すると、実行結果に次のような情報が含まれます。
  16. <NAME_ID_STATEMENTSTATUS>
        Jack Black | 1 (online=1; printed=0)
    </NAME_ID_STATEMENTSTATUS>

式の設定

式エディタは、戻り値型の式を編集する際に最もよく使用するツールです。 たとえば、戻り値型に次のような要素が含まれているとします。

ORDERID xsd:int

式エディタを使用して、式のスコープを次のように単一の顧客に制限できます。

Expression>{fn:data($o/ORDERID)} eq "1001"

XQuery 関数パレットには関数のプロトタイプが用意されており、これらをエディタにドラッグ アンド ドロップして使用できます。また、組み込みのライン エディタを使用して、関数を直接入力することもできます。

図 6-36 式エディタ

式エディタ

式エディタの操作は、多機能エディタの操作に似ています。 要素を選択すると、作業領域内の他のアーティファクトがグレー表示になります。 ただし、式エディタには、作業領域内のどのノードからでも要素をドラッグできます。

XQuery 演算子は、図 6-30 のようなドロップダウン リストから選択できます。もちろん、直接入力することも可能です。

 


クエリ コンポーネントの管理

選択したデータ要素を名詞 (作業の対象)、関数を動詞 (アクション) と考えた場合、データ要素間のマッピングによってクエリを表現する論理文が作成されます。

結果とクエリ パフォーマンスは、以下の方法によって大幅に変わります。

XQuery を記述してテスト ビューで実行することもできますが、一般的には次の手順でクエリを構築します。

注意 : 一部の操作は確定的ではありません。 たとえば、ノード内の要素が戻り値型にマップされている場合に、そのマッピングを削除せずにノードを削除するとエラー状態になる可能性があります。 これを回避するには、[元に戻す] をクリックしてからマッピングを削除するか、ソース ビューで必要な変更を加えます。

 


データ表現と戻り値型要素の操作

要素間をマップすると、データ ソース要素と戻り値型 (または入力パラメータを必要とする中間ノード) との間に仮想的な関係が確立します。

スキーマ要素には、単純要素と複合要素の 2 種類があります。 複合要素には、複数の要素または属性が含まれます。

図 6-37 複合要素と単純要素を含む展開されたスキーマ

複合要素と単純要素を含む展開されたスキーマ

複合要素を展開するには、要素名の左にあるプラス記号 (+) をクリックします (名前自体をダブルクリックすると編集モードに切り替わります)。

戻り値型へのマッピング

単純なデータ サービス関数の作成」で説明したように、XQuery エディタでは、戻り値型へのグラフィカルなマッピングに基づいてクエリが自動的に生成されます。

XQuery エディタは、「値マッピング」と「複合要素マッピング」の 2 種類のマッピングをサポートしています。 値マッピングでは、ソースの要素または属性の値のみを、そのターゲットの要素または属性の値にマップできます。 要素マッピングでは、ソース要素 (単純または複合) をターゲットにマップできます。

要素を戻り値型にマップするには、その要素をスコープに含める必要があります。 マップしようとしている要素がスコープに含まれていない場合は、そのマッピングが無効であることを示すメッセージが表示されます (図 6-38)。 無効なマッピングは、基底の for 文または let 文において、データ要素と戻り値型スキーマとの関連付けを正常に処理できない場合に発生します。

図 6-38 マッピングが無効な場合に表示される警告メッセージ

マッピングが無効な場合に表示される警告メッセージ

要素のスコープの詳細については、「XML 型と戻り値型」および「XML 型と戻り値型を編集する」を参照してください。

要素と属性を型にマップする

要素名の横に表示される疑問符 (?) は、それが省略可能な要素である (つまり、クエリにおいて必須ではない) ことを表します。 主キーを省略可能な要素にすることはできません。

複合要素を戻り値型へマップする

複合要素を、ソースから戻り値型にすばやくマップできます。 これを誘導マッピングといい、戻り値型の全部または一部をソース表現に一致させる必要がある場合に便利です。

要素を型にマップすると便利な状況はたくさんあります。たとえば以下の場合です。

完全に一致しない場合は、複合要素から戻り値型へのマッピングが追加されます。

要素をマップ (投影) するメリットは以下のとおりです。

図 6-39 に、複合要素を戻り値型にマップした後の状態を示します。

図 6-39 複合要素のマッピングの例

複合要素のマッピングの例

注意 : 複数の要素を、1 つのターゲット要素にマップすることはできません。
ソースからターゲットへのマッピングのオプション

ソースを戻り値型にマップする方法としては、値マッピング、上書きマッピング、追加マッピングの 3 つがあります。

注意 : 戻り値型に変更を加えた場合は、それをデータ サービス XML 型に伝播する必要があります。そのためには、戻り値型のタイトルバーを右クリックし、[XML 型の保存および関連付け] オプションを選択します。

マッピングを削除する

要素間のマッピングを削除するには、マッピング線 (リンク) を右クリックして [削除] を選択します。 マッピング線を選択した状態で、〔Delete〕を押して削除することもできます。

戻り値型の変更

クエリから返される情報の形式は、その戻り値型によって決まります。 マッピングと戻り値型オプションを組み合わせることで、以下の操作が可能になります。

戻り値型を変更する必要があるのは、[XML 型の保存および関連付け] コマンドを使用してその変更をデータ サービスの XML 型に伝播する必要がある場合だけです。「単純なデータ サービス関数の作成」を参照してください。

戻り値型を編集する

いずれかの要素を右クリックすると、戻り値型を編集できます。 XQuery エディタで型を編集するためのオプションは、「XML 型を編集する」で説明したオプションとは多少異なります。 たとえば、戻り値型では、ゾーンを作成してクエリに for 句を自動的に追加できます。これにより、結果が「マスター/詳細」形式になります。

注意 : 戻り値型を変更してそのままクエリを実行することは可能ですが、多くの場合、return 句とデータ サービスの XML 型が一致していない状態でアプリケーションからクエリを呼び出すと問題が発生します。

表 6-41 に、戻り値型の主な編集オプションをまとめます。

表 6-41 戻り値型の主な右クリック メニュー オプション
オプション
説明
[子要素の追加]
現在選択されている要素の子要素を作成する。
[複合型子要素の追加]
新しい複合型子要素のスキーマおよび型を指定できる。 デフォルトでは、スキーマのルート要素の型になる。 ただし、スキーマに複数のグローバル要素がある場合は、まずルートにする要素を指定する必要がある。
[属性の追加]
選択されている要素の属性を作成する。
[条件の作成]
現在選択されている要素の上に「条件」という名前の要素を挿入し、その要素 (およびその子要素) のクローンを作成する。
条件要素は、if-then-else コンストラクトと組み合わせて使用できる。 その後、XQuery エディタで変換ロジックを開発し、その条件の適切なブランチにマップできる。
[クローン]
選択されている要素 (およびその子要素) をスキーマ階層の同じレベルに複製する。
単純要素を複製すると、マッピングおよび型のない要素が同じ名前で作成される。
[ゾーンとしてマーク] /
[ゾーンの削除]
現在選択されている要素 (およびその子要素) のゾーンを設定 (または削除) する。
要素がゾーンに含まれていると、クエリから返されるときの形式がマスター/詳細形式になる。 「戻り値型にゾーンを設定する」を参照。
[削除]
選択されている要素 (およびその子要素や属性) を削除する。
[検索]
[テキストの検索] ダイアログが表示され、戻り値型内のテキスト文字列を検索できる。オプションとして、[大文字と小文字を区別する]、[完全に一致する単語だけを検索する]、[ワイルドカード (* および ?) を使用して検索する]、[正規表現] を指定できる。

[複合マッピングの展開] は、誘導マッピングの場合にのみ選択可能になる特別なオプションです。 詳細については、「複合要素を戻り値型へマップする」を参照してください。

戻り値型に変更を加える際は、以下の点に注意してください。

複合子要素を追加する

複合子要素を戻り値型に追加するには、スキーマを選択してグローバル要素 (型) を指定します。 複合子要素は、データ サービス スキーマ (.xsd ファイル) を戻り値型に組み込みます。

複合グローバル要素を戻り値型に追加するには、次の手順に従います。

  1. 複合要素の親にする要素をクリックします。
  2. 右クリックして [複合型子要素の追加] を選択します。
  3. 表示されたダイアログで、参照ボタンを使用してスキーマを指定します。 グローバル要素は、スキーマに 1 つのグローバル要素しか含まれていない場合は自動的に選択されます。 自動的に選択されない場合は、使用するグローバル要素を選択する必要があります。
注意 : 複合子要素を追加する場合は、戻り値型内の同等の要素の末尾に配置する必要があります。

戻り値型にゾーンを設定する

AquaLogic Data Services Platform では、戻り値型のゾーンによって、クエリの結果がどのように配置されるかが決まります。 XQuery エディタでゾーンを追加または変更するという動作は、ソース ビューで文の従属順序を追加または変更しているのと同じです (ゾーンを使用して論理データ サービスを構築し、マスター/詳細形式にネストされたデータを作成する詳細な例については、「単純なデータ サービス関数の作成」を参照してください)。

図 6-42 の例では、特定の顧客の CUSTOMER_ORDER 要素がその顧客の下にグループ化されます。

図 6-42 2 つのゾーンが設定された戻り値型の例

2 つのゾーンが設定された戻り値型の例

デフォルトでは、戻り値型に設定されているゾーンは 1 つのみです。 しかし、ゾーン要素を追加しなくても、処理は自然な順序で繰り返されます。 図 6-42 に示した単純な例でいうと、ある顧客の注文が複数ある場合は、一致するすべての注文が処理されるまで、顧客情報と注文情報の両方が繰り返し処理されます。

次の少し簡略化された XML は、ゾーンを 1 つのみ使用した場合です。

<CUSTOMERID>987655</CUSTOMERID>
<CUSTOMERNAME>Supermart</CUSTOMERNAME>
<ORDER>
<ORDERID>632</ORDERID>
<CUSTOMERID>987655</CUSTOMERID>
<CUSTOMERID>987655</CUSTOMERID>
<CUSTOMERNAME>Supermart</CUSTOMERNAME>
<ORDER>
<ORDERID>888</ORDERID>
<CUSTOMERID>987655</CUSTOMERID>
..

この例では、CUSTOMERNAME と CUSTOMERID が繰り返し処理されています。

これに似た関数の XQuery ソースを見ると、どのように処理が繰り返されるかが分かります。

for $CUSTOMER in ns0:CUSTOMER()
for $CUSTOMER_ORDER in ns1:CUSTOMER_ORDER()
where $CUSTOMER/CUSTOMER_ID = $CUSTOMER_ORDER/C_ID
return <ns2:CUSTOMER7>
<CUSTOMER_ID>{fn:data($CUSTOMER/CUSTOMER_ID)}</CUSTOMER_ID>
<LAST_NAME>{fn:data($CUSTOMER/LAST_NAME)}</LAST_NAME>

<ns1:CUSTOMER_ORDER>
<ORDER_ID>{fn:data($CUSTOMER_ORDER/ORDER_ID)}</ORDER_ID>
<C_ID>{fn:data($CUSTOMER_ORDER/C_ID)}</C_ID>
<TOTAL_ORDER_AMT>{fn:data($CUSTOMER_ORDER/TOTAL_ORDER_AMT)}</TOTAL_ORDER_AMT>
</ns1:CUSTOMER_ORDER>
</ns2:CUSTOMER7>

一方、CUSTOMER_ORDER 要素の周囲に繰り返し可能なゾーンを作成すると、ソース ビューには従属する for 句が追加されます。

for $CUSTOMER in ns0:CUSTOMER() 
return <ns2:CUSTOMER7>
<CUSTOMER_ID>{fn:data($CUSTOMER/CUSTOMER_ID)}</CUSTOMER_ID>
<LAST_NAME>{fn:data($CUSTOMER/LAST_NAME)}</LAST_NAME>{
for $CUSTOMER_ORDER in ns1:CUSTOMER_ORDER()
where $CUSTOMER/CUSTOMER_ID = $CUSTOMER_ORDER/ORDER_ID
return
<ns1:CUSTOMER_ORDER>
<ORDER_ID>{fn:data($CUSTOMER_ORDER/ORDER_ID)}</ORDER_ID>
<C_ID>{fn:data($CUSTOMER_ORDER/C_ID)}</C_ID>
<TOTAL_ORDER_AMT>{fn:data($CUSTOMER_ORDER/TOTAL_ORDER_AMT)}</TOTAL_ORDER_AMT>
</ns1:CUSTOMER_ORDER>
}
</ns2:CUSTOMER7>

2 番目のコードの where 句では、すべての注文を 1 つの顧客インスタンスにまとめています。

ゾーンを作成するには、要素を右クリックして [ゾーンとしてマーク] を選択します。 作成されたゾーンは、そのゾーンの制御領域内をマウスでポイントすると強調表示されます (図 6-42)。

XQuery エディタのノードとゾーンを関連付ける

XQuery では、for、let、および group by 句を別の for、let、または group by 句で囲むことができます。 同様に、ノードのタイトルバー上のゾーン作成アイコンを使用して、これらのコンストラクトを表すノードを戻り値型のゾーンに関連付けることができます (この章の冒頭の XQuery エディタの例で示した 図 6-10 を参照)。 このアイコンをドラッグして既存のゾーンにドロップすると、そのノードがゾーンに関連付けられます。

この操作が成功したかどうかを確認するには、マウスでゾーン アイコンをポイントします。 正常に関連付けられていると、適切なゾーンが強調表示されます (図 6-42 を参照)。 または、実際にソース ビューを見たり、テスト ビューでクエリを実行したりして確認することもできます。

注意 : XQuery エディタでゾーンや XQuery の他の要素を作成する場合、どの順番で作成したかが重要になる場合があります。 たとえば、ゾーンは、where 句によって 2 つのノードを関連付ける前に作成する必要があります。
ゾーンを削除する

ゾーンを削除するには、ゾーンの親要素を右クリックして [ゾーンの削除] を選択します。

戻り値型を検証して保存する

関数の戻り値型に変更を加え、データ サービスをその変更に合致させて最も適した状態にすることができます。

図 6-43 戻り値型の管理オプション

戻り値型の管理オプション

戻り値型を管理するため、以下の右クリック オプションが用意されています。


  ページの先頭       前  次