目次


新しくなった DB2 バージョン 9.5 での pureXML 機能強化の概要

DB2 バージョン 9.5 における pureXML の新機能と機能強化

Comments

DB2 9 での XML サポートの概要

ネイティブ XML データ型を導入した DB2 9 では、XML を構文解析済み階層型 (ネイティブ) フォーマットで保管し、ユーザーが XQuery および SQL/XML 言語を使って XML データにクエリーを実行できるようにしています。DB2 の XQuery 式は、DB2 データベースに保管された XML 文書をクエリーを実行するための XML のソースとして使用します。データベースに保管された XML 値は xmlcolumn 関数によって連結され、sqlquery 関数によって XML シーケンスが XQuery パーサーに渡されます。

XQuery 言語とは別に、DB2 9 には XML データとリレーショナル・データを 1 つのクエリーで同時に処理するための SQL/XML 関数が用意されています。SQL/XML 関数のうち、例えば xmlqueryxmltablexmlexists を使用すると XQuery を SQL 文に組み込むことができます。

スキーマの妥当性の検証もサポートする DB2 9 では、スキーマをデータベースに登録してデータベース・オブジェクトとして機能させるための新しいコマンドとストアード・プロシージャーが導入されています。登録したスキーマを使って挿入操作の前または後に XML 値の妥当性を検証するには、xmlvalidate 関数を使用します。登録したスキーマには、XML データをリレーショナル・テーブルに分解するための注釈を付けることも可能です。リレーショナル値を XML 文書に変換するには、xmlelementxmlattributes などのパブリッシング関数を使用します。また、XML データ・サポートに応じてユーティリティー (インポート、エクスポートなど) も同じく更新されています。バージョン 9 での XML サポートについての詳細は、「参考文献」セクションを参照してください。

DB2 V9.5 での新しい内容

既存の DB2 9 機能は、XML データの処理と操作という点で極めて強力なものです。DB2 V9.5 ではこれらの機能のいくつかを強化するとともに、XML の処理を一層強力に、そして一層効率的にするための新機能を導入しています。以下に、この記事で取り上げる機能をリストします。

  • 非 Unicode データベースでの XML サポート
  • サブ文書の更新
  • 基本テーブルでの保管/圧縮
  • 互換性のある XML スキーマ展開
  • 妥当性検証トリガー
  • 妥当性検証のチェック制約
  • XML レプリケーション
  • XML フェデレーション
  • XML ロード
  • sqlquery() パラメーター
  • ユーザー・フレンドリーなパブリッシング関数
  • SQL/XML 関数へのデフォルト・パラメーター受け渡し
  • XSLT 関数
  • XML 分解の機能強化
  • XML 索引の機能強化
  • 索引アドバイザーおよびオプティマイザーの機能強化
  • DB2 Data Web サービス

以降のセクションで使用するコード・サンプルのほとんどは、DB2 V9.5 サンプル・データベースに基づいています。サンプル・データベースを作成するには、DB2 V9.5 コマンド行プロセッサーから db2sampl コマンドを実行してください。また、first step からサンプル・データベースを作成することもできます。ファースト・ステップ (first step) は DB2 が提供するツールで、DB2 のインストール後に実行されます。このツールは後から実行することも可能で、その場合には Windows のスタート・メニューから、すべてのプログラム > IBM DB2 > db2 copy name > Set up tools > first steps に進んでください。

非 Unicode データベースでの XML サポート

DB2 9 では、XML データを使用したデータベースは UTF-8 コード・ページでしか作成することができません。これはつまり、XML 文書の値が ASCII フォーマットであっても UTF-8 データベースに保管しなければならないということです。DB2 V9.5 ではこの制約を排除し、ユーザーがあらゆるコード・セットで XML 列が含まれるデータベースを作成できるようにしています。これにより、データベースが UTF-8 で作成されていないとしても、テーブルを変更して XML 列を追加したり、あるいは XML 列が含まれる新しいテーブルを作成できるようになりました。

以下は、サンプル・データベースおよび XML 列が含まれるサンプル・テーブルを作成するコードです。

リスト 1. デフォルト・コード・ページを使用したデータベース
db2 CREATE DATABASE sampledb
db2 CONNECT TO sampledb
db2 CREATE TABLE record(id INT, record XML)

サブ文書の更新

DB2 V9.5 では、ユーザーがデータベースに保管された XML 文書を部分的に更新することができます。新たに導入された XQuery の transform 式は insert、delete、replace、rename という 4 つの更新式を使って XML 文書のフラグメントを変更します。transform 式は XQuery 言語の一部なので XQuery 式に組み込めますが、更新式については、DB2 V9.5 では transform 式のなかでしか使用することができません。transform 式には以下の節があります。

  • COPY: transform 式に含まれる COPY 節は、ソース XML 値を変数にバインドします。クエリーでは、この COPY 節が更新式によって処理されます。
  • MODIFY: MODIFY 節は、コピーされた XML を更新式に従って変更します。MODIFY 節には複数の更新式を含められます。
  • RETURN: RETURN 節は、変更後の値を返します。

以下に、4 つの更新式について説明します。

  • insert 式は、既存の XML 文書に新しい XML ノードを挿入する場合に使用します。ユーザーは、XML 文書内での挿入位置を指定することができます。
  • replace 式は、特定ノードの特定の値を更新する場合に使用します。
  • delete 式は、XML 文書から特定のノードを削除する場合に使用します。
  • rename 式は、ノードの名前を変更する場合に使用します。

transform 式は XQuery 言語の一部であるため、xmlquery 関数を使って SQL 文内で使用することも、UPDATE 文内で使用して XML 値を更新することもできます。

リスト 2 は、サンプル・データベースに含まれる customer テーブルの info 列を更新するコードです。このコードは、CID 属性と cid リレーショナル列の値とが一致するように XML 文書を更新します。

リスト 2. テーブルに対する transform 式による UPDATE
UPDATE CUSTOMER
SET info = 
      XMLQUERY('transform 
                      copy  $po := $INFO
                      modify  
                           do replace value of $po/customerinfo/@Cid  with $CID
                return  $po' 
                passing info as "INFO", cid as "CID") 
       WHERE cid=1000

テーブルの XML 列に XML の妥当性検証のチェック制約が設定されている場合、更新操作の前に、新しい XML 値の妥当性を手作業で、あるいはトリガーを作成して検証する必要があるかもしれません。

以下のサンプル・コードは、purchaseorder テーブルから項目を削除し、変更後の文書をクエリー結果として返します。

リスト 3. transform 式
xquery 
transform 
copy 
   $po := db2-fn:sqlquery(‘select porder from purchaseorder where 
                           custid = 1002 and orderdate=“2006-02-18”’)
modify  
   do  delete $po/ PurchaseOrder/item[partid = “100-201-01”]
return  $po

さまざまな transform 式の例については、サンプル・コード xupdate.db2 を参照してください。このサンプルは、sqllib/samples/xml/xquery/clp ディレクトリーにあります。

基本テーブル行での保管/圧縮

DB2 9では、XML データはリレーショナル・データとは別の場所に保管されます。この保管場所は XDA (XML Data Area) と呼ばれます。DB2 9 はすべての XML 文書をこの XDA に保管するため、リレーショナル・データと併せて XML 値にもアクセスするには、入出力が追加で必要となります。XML 文書のサイズが大きくなく、リレーショナル値を保管した後のページ・サイズに XML 値も収容できるだけの余裕がある場合、同じページに XML を保管できればパフォーマンスに大きな利点をもたらすことができます。例えば、以下の利点です。

  • 圧縮: XML データはリレーショナル・データと一緒に保管されるため、DB2 9 で導入された圧縮技術による圧縮が可能になります。XML 値の相対サイズがリレーショナル・データの相対サイズよりも大きければ、大幅な圧縮を実現することができます。
  • クエリーのパフォーマンス: XML データがリレーショナル・データと同じ場所に保管されることから、XML データのインライン化によって基本テーブルのサイズが通常よりも大きくなります。XML データへのアクセスがテーブル内の他のリレーショナル値と同じく頻繁に行われる場合、基本テーブルが大きいと XML データにクエリーを実行する際にメリットがあります。

そこで、DB2 V9.5 で導入されたのが基本テーブル行での XML データ保管です。つまり、1 行あたりのリレーショナル・データと XML データの合計サイズがページのサイズを上回っていなければ、XML データをリレーショナル・データと同じ物理ページに保管することができます。このように、基本テーブル行での XML データ保管は合計レコード・サイズがページ・サイズを上回らない場合にのみ可能で、ページ・サイズを超える場合には、XML データは通常通り XML 保管場所 (XDA) に保管されます。DB2 で許容される最大ページ・サイズは 32KB なので、XML 値の最大インライン長も 32KB に制限されます。文書の内部ツリー表現のサイズが指定されたインライン長より小さければ、インライン化に対応できます。リスト 4 は、基本テーブル行での XML データ保管を指定してテーブルを作成するコードです。

リスト 4. 基本テーブルでのXML データ保管
db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024)

XML データをリレーショナル・データと一緒に保管するように指定するには、INLINE オプションを使用します。このようにすると、すべてのデータが同じ場所で検出されることになるので、XML データをフェッチするクエリーには好都合です。その一方、XML 以外のデータにアクセスするクエリーの場合には、リレーショナル・データを検出するための入出力が増えることになる可能性があります。

基本テーブル行に XML データを保管する上でもっとも理想的なのは、テーブルに含まれる XML 型の列が 1 つだけで、XML 文書の最大サイズがページ・サイズを超えていない場合です。

互換性のある XML スキーマ展開

DB2 V9.5 では柔軟性を高め、スキーマを有効に展開できるようにするため、XML スキーマの更新機能を導入しています。この更新機能は、以前に登録されたスキーマと新しいスキーマが互換する場合、古いスキーマを新しいスキーマで更新します。新旧 2 つのスキーマが互換するのは、古いスキーマで妥当性が検証された XML 文書が新しいスキーマでも有効な場合です。

例えば、新しいスキーマに新規オプション要素が追加されている場合、このスキーマは古いスキーマと互換することになります。新しい要素のオプションという性質上、古いスキーマで検証された XML 文書の妥当性はそのまま維持されるからです。そのため、新しい XML 文書ではこのオプション要素を使用することができ、新規スキーマを使って文書の妥当性を検証することもできます。以前の文書は引き続き有効であることから、スキーマの更新後に必要な作業はありません。スキーマに互換性がなければ、スキーマの更新は失敗します。更新されたスキーマには、古いスキーマの注釈および ID も引き継がれます。

スキーマを更新するために導入されたのは、XSR_UPDATE ストアード・プロシージャーです。このストアード・プロシージャーは互換性をチェックし、新しいスキーマが互換する場合にのみスキーマを更新します。ユーザーがスキーマを更新するには、新旧のスキーマをそれぞれ単独で登録してから XSR_UPDATE ストアード・プロシージャーを呼び出す必要があります。古いスキーマを維持するか、またはスキーマの更新後に削除するかはユーザーが選択できます。

customer テーブルの info 列を例にとってみましょう。info 列の addr 要素は、以下のように定義されています (完全なスキーマは、sqllib/samples/db2sampl ディレクトリーにあります)。

リスト 5. 古い XML スキーマ定義
<xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                          name="addr" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="street" type="xs:string" minOccurs="1" />
              <xs:element name="city" type="xs:string" minOccurs="1" />
              <xs:element name="prov-state" type="xs:string" minOccurs="1" />
              <xs:element name="pcode-zip" type="xs:string" minOccurs="1" />
            </xs:sequence>
            <xs:attribute name="country" type="xs:string" />
          </xs:complexType>
        </xs:element>

その後、ユーザーにオプション要素である HouseNo 要素が必要になったとします。登録済みのスキーマをその ID を変えずに更新するには、まず、要素を追加した新規スキーマを登録しなければなりません。新しい addr 要素の定義は以下のようになります。

リスト 6. 新しい XML スキーマ定義
<xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                          name="addr" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="HouseNo" type="xs:string" minOccurs="0" />
              <xs:element name="street" type="xs:string" minOccurs="1" />
              <xs:element name="city" type="xs:string" minOccurs="1" />
              <xs:element name="prov-state" type="xs:string" minOccurs="1" />
              <xs:element name="pcode-zip" type="xs:string" minOccurs="1" />
            </xs:sequence>
            <xs:attribute name="country" type="xs:string" />
          </xs:complexType>
        </xs:element>

登録が完了すると、以下のストアード・プロシージャーを使って既存のスキーマを新しいスキーマで更新できるようになります。

リスト 7. XSR_UPDATE によるスキーマの更新
db2 call XSR_UPDATE('RSCHEMA','CUSTOMER','RSCHEMA','CUSTOMER1',0)

最後の引数の値である 0 は、更新後に新規スキーマが削除されないことを示します。この値をゼロ以外の値に設定すると、新規スキーマは更新操作の後に削除されます。

互換性のある XML スキーマ展開の例についは、サンプル・コード xsupdate.db2 を参照してください。このサンプル・コードは sqllib/samples/xml/clp ディレクトリーにあります。

妥当性検証トリガーのサポート

アプリケーションの柔軟性を向上させ、ユーザーに入力 XML 文書の妥当性の自動検証機能を提供するため、DB2 V9.5 では BEFORE トリガーの XML サポートが拡張されています。BEFORE トリガーとは、BEFORE オプションによって作成され、挿入/更新/削除操作の前に実行されるトリガーのことです。BEFORE トリガーの XML サポート拡張により、新しい変数で XML 値を参照し、トリガーのアクション部分が新規の値に xmlvalidate 関数を適用できるようになりました。さらにトリガーの WHEN 節を使用して、新規の値の妥当性が検証されているか、または指定されたスキーマのいずれに対しても妥当性が検証されていないかをチェックすることができます。このチェックを行うには、WHEN 条件に IS VALIDATED 節または IS NOT VALIDATED ACCORDING TO XMLSCHEMA 節を使用します。WHEN 条件による出力に応じて、XML 値の妥当性を検証するか、あるいは新しい値を設定しなければなりません。現在、XML 型の新しい遷移変数で使用できるのは xmlvalidate 関数だけです。このトリガーは作成されると自動的に有効になり、テーブル内のすべての挿入操作に対して実行されるので、XML 値の妥当性が INSERT 文で検証されない場合には、このトリガーを使用して XML 値の妥当性を検証することができます。

以下のコードは、customer テーブルとそのテーブルに定義するトリガーとを作成する DDL 文です。このトリガーはテーブルで挿入操作が行われるたびに起動され、XML 文書の妥当性が INSERT 文のなかで検証されていない場合には、文書を挿入する前に xmlvalidate 関数を使って XML 文書の妥当性を検証します。このサンプル・コードでは、既存の customer テーブルがないこと、そして customer スキーマがデータベースに登録済みであることを前提としています。

リスト 8. テーブルに定義されたトリガー
CREATE TABLE Customer ( Cid        BIGINT NOT NULL,
                          info       XML,
                          History    XML,
                          CONSTRAINT PK_CUSTOMER PRIMARY KEY (Cid))
                       
CREATE TRIGGER Trigger_customer NO CASCADE BEFORE INSERT ON customer 
     REFERENCING NEW AS n 
     FOR EACH ROW MODE db2sql
     WHEN (n.info IS NOT VALIDATED ACCORDING TO XMLSCHEMA ID customer)
     BEGIN ATOMIC
       SET n.info = XMLVALIDATE(n.info ACCORDING TO XMLSCHEMA ID customer);
     END@

これとは別のシナリオを使用しているサンプル・コード xmltrig.db2 には、新規の値を割り当てたり、XML 値の妥当性の検証を行うためにトリガー内部で実行できる操作が記載されています。このサンプル・コードは sqllib/samples/xml/clp ディレクトリーに配置されています。

XML の妥当性検証のチェック制約

チェック制約とは、テーブルの作成時にテーブル列に設定できる制約のことです。このタイプの制約が有効である限り DB2 は挿入操作を許可しますが、有効でなければ挿入操作が失敗します。

DB2 V9.5 では XML 値のチェック制約をサポートします。チェック制約を使用すると、ユーザーが XML 列での妥当性の検証を実行することができます。BEFORE トリガーと同じように、妥当性の検証を実施するにはチェック制約で IS VALIDATED ACCORDING TO XMLSCHEMA 節を使用します。BEFORE トリガーと唯一異なるのは、チェック制約は妥当性の検証条件をチェックするだけで、実際の検証は行わないという点です。そのため、ユーザーが INSERT 文で xmlvalidate を使って明示的に XML 値の妥当性を検証するか、または BEFORE トリガーを使用して自動で検証を行わなければなりません。挿入操作が成功するのは、XML 値がチェック制約に指定されたスキーマに従って有効な場合のみです。

テーブルの XML 値に BEFORE トリガーおよびチェック制約を適用すると、XML 値が常に指定されたスキーマに有効であることを確実にできます。BEFORE トリガーは挿入操作が実行されるたびに自動で妥当性の検証を行う一方、チェック制約を使用するとユーザーが明示的に xmlvalidate 関数を使用することになるからです。この 2 つを併用すれば、XML 値の完全性を確保することができます。

リスト 9 のコードでは、リスト 8 で作成した customer テーブルを変更してテーブルにチェック制約を設定しています。

リスト 9. チェック制約
db2 ALTER TABLE customer ADD CONSTRAINT check_info 
            CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer)

上記で作成したチェック制約により、文書の妥当性が customer スキーマに従って検証されることが確実になります。トリガーが存在しない場合は、ユーザーが xmlvalidate 関数を使用して明示的に値の妥当性を検証する必要があります。

サンプル・コード xmlcheckconstraint.db2 には、チェック制約を使用して同じ構造のさまざまなテーブルでビューを作成し、スキーマによるテーブル・パーティショニングを実装する例が記載されています。

XML レプリケーションのサポート

DB2 V9.5 では、XML データをサポートする別のデータベースへの XML データのレプリケーションをサポートします。レプリケーションを行うには、WebSphere ®Replication Server バージョン 9.5 または WebSphere Data Event Publisher バージョン 9.5 を使用します。WebSphere Replication Server を使って XML データ型をサポートする統合ターゲットに XML データを複製することも、XML を CLOB/BLOB 列にマッピングすることもできます。

XML データのレプリケーションは他のあらゆるリレーショナル列と同様、トランザクション・メッセージ内で行われるため、トランザクション・メッセージの最大長によって複製される XML のサイズが制限されます。データのサイズが大きい場合は、元の文書の代わりにプレースホルダー文書を挿入することができます。また、例外も例外テーブルに挿入することができます。

レプリケーションの際に、XML スキーマの登録を複製することは不可能です。さらに、レプリケーション中に XML データの妥当性を検証することもできません。

XML フェデレーションのサポート

WebSphere Federation Server Version 9.1 は pureXML をサポートしているので、ローカル側とリモート側の XML データ・ストアを統合することができます。XML データ・ストアを統合すると、さまざまなデータベースからの XML データをローカル・データとして表示し、データのクエリーに DB2 XQuery と SQL/XML を適用できるようになります。リモート・フェデレーテッド・データベースでビューを作成して XML データをシリアライズされたストリングとして表示し、WebSphere Federation Server で構文解析して XML 値に戻すことも可能です。すると DB2 では、そのビューのために作成されたニックネームを使って、このデータに対して SQL/XML 言語と XQuery 言語を使ってクエリーを実行することができます。

統合されたさまざまなソースから入力される XML データについても、ローカル XML 値の妥当性を検証する場合と同じように db2 xmlvalidate 関数を使用して妥当性を検証することができます。

WebSphere Federation Server を pureXML に対して使用する方法についての詳細は、「参考文献」セクションを参照してください。

ロード・サポート

DB2 9 では主に 2 通りの方法でテーブルに XML 値を設定することができます。1 つは insert 文で XML 値をテーブルに挿入するという方法、そしてもう 1 つは import ユーティリティーでデータを一括してテーブルにインポートするという方法です。

DB2 V9.5 ではこのサポートが load ユーティリティーにも拡張され、XML データの場合に import がサポートするオプションのほとんどが load でもサポートされるようになりました。例えば、XML データのパスは XML FROM 節を使って指定することができます。また、XMLVALIDATE USING 節を使用して load 操作の際に XML データの妥当性を検証することもできます。一方、異なるオプションとしては XDS、SCHEMA、そして SCHEMALOCATION HINTS オプションがあります。例えば XDS オプションを指定すると DEFAULT、IGNOREMAP 節を使用することができます。これらのオプションの意味は import での場合と同じです。データのコード・ページを指定するには、ファイル・タイプ修飾子の XMLCHAR および XMLGRAPHIC を使用します。XML データ指定子 (XDS) は、XML 値を指定するためにデータ・ファイル内で使用します。load リスタートの振る舞いは以前と同じで、すべての XML 文書をスキャンして索引をすべて再ビルドします。

DB2 V9.5 で XML データに使用できるロード・オプションについては、サンプル・コード xmlload.db2 を参照してください。このサンプル・コードは、sqllib/samples/xml/clp ディレクトリーにあります。

XSLT サポート

DB2 V9.5 は、XSL 変換 (XSLT) を使用してデータベース内部で XML 文書を処理する機能を提供します。データベースに保管された XML 文書は、XSLT スタイル・シートを適用して HTML 形式に変換することができます。この変換を行うために DB2 V9.5 が導入しているのが xsltransform 関数です。さらに、DB2 V9.5 ではパラメーターを使用したスタイル・シートもサポートします。xsltransform 関数はデータベース・テーブル列に保管された XSLT スタイル・シートを XML 文書として XML 文書に適用できることから、データベースから変換済みの XML 文書を取得し、その文書を直接 Web で表現できるという柔軟性がユーザーにもたらされます。

例えば、以下の XML 文書があるとします。

リスト 10. XML 文書
<?xml version="1.0"?>
   <products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <product pid="100-201-01">
       <description>
         <name>Ice Scraper, Windshield 4 inch</name>
         <details>Basic Ice Scraper 4 inches wide, foam handle</details>
         <price>3.99</price>
       </description>
     </product>
    </products>

上記の文書に対応する XSLT スタイル・シートは以下のとおりです。

リスト 11. XSLT スタイル・シート
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="products">
   <html>
   <head/>
     <body>
        <table border="1">
     <th>
        <tr>
            <td width="80">product ID</td>
            <td width="200">product name</td>
            <td width="200">price</td>
            <td width="50">details</td>
         </tr>
      </th>
      <xsl:apply-templates/>
      </table>
     </body>
    </html>
    </xsl:template>
    <xsl:template match="product">
    <tr>
       <td><xsl:value-of select="@pid"/></td>
       <td>><xsl:value-of select="./description/name"/></td>
       <td><xsl:value-of select="./description/price"/></td>
       <td><xsl:value-of select="./description/details"/></td>
     </tr>
     </xsl:template>
  </xsl:stylesheet>

これらの文書はテーブルに保管するか、あるいはパラメーターとして渡すことができます。パラメーターとして値を渡す場合は、文書が整形式 XML 文書であることを確認してください。パラメーターのデータ型は XML、VARCHAR、CLOB、または BLOB のいずれかです。文書とスタイル・シートの両方がテーブルに保管されている場合は、以下のステートメントを使って XML 文書を変換することができます。

注: この例では、文書が保管されているテーブルの名前は xslt、XML 文書の列名は xmldoc、XSL 文書名は xsldoc という前提となっています。

リスト 12. XSLTransform 式
SELECT XSLTRANSFORM (description USING stylesheet AS CLOB (10M))
	FROM product_details

このクエリーが出力するのは、ブラウザーで表示可能な HTML 文書です。リスト 13 に、この HTML 出力を記載します。

リスト 13. XSLTransform 式による HTML 出力
<html>
 <head>
  <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 </head>
 <body>
  <table border="1">
   <th>
    <tr>
      <td width="80">product ID>td> 
      <td width="200">product name>/td>
      <td width="200">price>/td>
      <td width="50">details>/td>
    </tr>
   </th>
   <tr>
     <td>100-201-01>/td>
     <td>Ice Scraper, Windshield 4 inch>/td>
     <td>3.99>/td>
     <td>Basic Ice Scraper 4 inches wide, foam handle>/td>
   </tr>
  </table>
 </body>
</html>

XML 文書と XSLT スタイル・シートを別々のテーブルに保管し、テーブルを結合することによって単一の XSLT スタイル・シートを複数の XML 値に適用することもできます。

パブリッシング関数

パブリッシング関数はリレーショナル・データを XML 値に変換するために使用する関数です。DB2 V9.5 では、DB2 9 で導入された SQL/XML サポートが拡張および単純化されています。DB2 9 のSQL/XML 関数の一部 (xmlelement など) では、XML 要素や属性、それにその他のノードなどの要素の値はテーブルのリレーショナル列から抽出されたり、明示的に指定されたりする一方、要素の名前はすべて指定しなければなりません。そのため、ユーザーは XML 値を生成する必要はあるけれども、要素の名前に煩わされたくはないと思うことがありました。

DB2 V9.5 では既存のパブリッシング関数に拡張機能を提供する方法として、xmlrow および xmlgroup という新しい関数を導入しています。いずれもテーブルの列から XML 要素の名前と値の両方を抽出する関数で、xmlrow 関数は XML として表現された行の値のシーケンスを出力し、xmlgroup 関数はすべての値を 1 つのルート・ノードにグループ化します。

サンプル employee テーブルには、従業員の住所詳細が以下のレコードとして維持されています。

IDNAMESTREETCITYSTATECOUNTRY
1manojsector14gurgaonharyanaindia

以下のクエリーは、上記の行に xmlrow および xmlgroup 関数を適用した例です。

リスト 14. 新しいパブリッシング関数
db2 SELECT XMLROW(id, name, street, city,state, country) FROM EMPLOYEE
<row>
 <ID>1</ID>
 <NAME>manoj</NAME>
 <STREET>sector14</STREET>
 <CITY>gurgaon</CITY>
 <STATE>haryana</STATE>
 <COUNTRY>india</COUNTRY>
</row>

db2 SELECT XMLGROUP(id, name, street, city,state, country) FROM EMPLOYEE
<rowset>
 <row>
  <ID>1</ID> 
  <NAME>manoj</NAME> 
  <STREET>sector14</STREET> 
  <CITY>gurgaon</CITY>
  <STATE>haryana</STATE> 
  <COUNTRY>india</COUNTRY> 
 </row>
</rowset>

DB2 9 で同じ結果を得るためには、列の値のそれぞれに xmlelement を適用し、さらに要素の名前を明示的に指定しなければならなくなります。

サンプル・コード xmlintegrate.db2 では、他の例やより複雑なパブリッシング関数の例を記載し、V9.1 バージョンでのクエリーの場合と比較しています。このサンプルは、sqllib/samples/xml/clp ディレクトリーに配置されています。

sqlquery 関数へのパラメーター受け渡し

DB2 9 で XQuery 式に SQL 文を組み込むには、sqlquery 関数を使用します。この関数が入力として取るストリング値は、有効かつ完全な SQL の SELECT 文です。DB2 9 では、この関数に XQuery 文からパラメーターを渡す手段はありませんでした。

DB2 V9.5 ではこの関数を拡張し、整数値を入力として取る parameter 関数を新たに導入しています。これにより、sqlquery 関数が複数の引数を入力として使用できるようになりました。最初の引数は、完全な SELECT 文を表すストリング値で、その後にパラメーターの値を表す引数が続きます。sqlquery 関数への最初のストリング引数には parameter 関数を含めることができます。この parameter 関数は 最初の必須ストリング引数に続いて、sqlquery 関数に渡される引数によって置き換えられます。parameter 関数に渡される整数値は、sqlquery 関数を呼び出す際の引数の位置を表しており、その位置の引数によってこの parameter 関数を呼び出している箇所が置き換わります。例えば parameter(1) の場合、パーサーはここにストリング引数に続く最初の引数を配置することになります。引数の型は、完全な SELECT 文が期待する値の型と同じでなければなりません。値を適切な型にキャストするには、cast 関数を使用することができます。

ここで、サンプル・データベースの customer テーブルを使った例を見てみましょう。サンプル・データベースは、db2sampl コマンドを実行して作成することも、ファースト・ステップから作成することもできます。ファースト・ステップは DB2 が提供するツールで、DB2 のインストール後に実行されます。このツールは後から実行することも可能で、その場合には Windows のスタート・メニューから、すべてのプログラム > IBM DB2 > db2 copy name > Set up tools > first steps に進んでください。

customer テーブルには、リレーショナル列である cid 列と、カスタマー ID を表すキー値があります。info という XML 列にある Cid 属性も同じくカスタマー ID を表します。データに整合性があれば、Cid 属性の値と cid 列の値は各行で一致するはずです。以下のクエリーは整合性のある行の数をチェックするため、Cid 属性の値を sqlquery 関数に渡してリレーショナル列 cid の値と比較します。

リスト 15. sqlquery 関数へのパラメーター受け渡し
xquery declare default element namespace "http://posample.org";
for $i in db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo/@Cid 
for $j in db2-fn:sqlquery("select info from customer where cid=parameter(1)", $i)
return
<out>{$i} </out>

上記のクエリーによって、データに整合性があるすべてのカスタマー ID が返されます。

サンプル・コード xqueryparam.db2 には、sqlquery 関数に 1 つのパラメーターを渡す場合と複数のパラメーターを渡す場合の好例が記載されています。このサンプル・コードが配置されている場所は、sqllib/samples/xml/clp ディレクトリーです。

既存の XMLQuery、XMLtable および XMLExists 関数へのデフォルト受け渡し動作

DB2 9 で SQL 文内に Xquery 文を組み込むために使用する関数は、xmlqueryxmltable、および xmlexists です。これらの関数に SQL 文からパラメーターを渡すには PASSING 節を使用します。

DB2 9 では、これらの関数のオカレンスが同じ SQL 文内に複数ある場合、それぞれのオカレンスごとに個別の PASSING 節が必要になるため、ときにはクエリーが複雑で大規模な構造を持つように見えてしまいます。そこで、DB2 V9.5 ではデフォルトの受け渡しメカニズムを使用するように関数を拡張し、関数内で使用する Xquery では列名が変数名として使用されるようにしました。明示的 PASSING 節が使用されていない場合、DB2 はデフォルトで変数に同じ列を渡します。そのため、クエリーのサイズは縮小され、理解しやすくなります。以下のコードは、サンプル・データベース・テーブルに基づくクエリーの例です。このクエリーは、Robert Shoemaker という名前のカスタマーの purchaseorder にある最初の項目をフェッチします。

リスト 16. SQL/XML 関数へのデフォルト受け渡し動作
SELECT XMLQUERY('declare default element namespace "http://posample.org"; 
                  $PORDER/PurchaseOrder/item[1]' )
     FROM purchaseorder AS p, customer AS c
     WHERE XMLEXISTS('declare default element namespace "http://posample.org";
                 $INFO/customerinfo[name="Robert Shoemaker" and @Cid = $CUSTID]')

SELECT 節の xmlquery 関数の場合、デフォルトでは purchaseorder テーブルの porder 列が渡されます。同様に、xmlexists 関数にはデフォルトで customerテーブルの info 列と custid 列が渡されます。これらの変数の名前は必ず大文字を使用してください。xquery はケース・センシティブ言語で、リレーショナル列の名前は常に大文字で保管されるためです。

XML の妥当性検証の制約

DB2 V9.5 では SELECT 文で使用する IS VALIDATED 節が強化され、ACCORDING TO XML SCHEMA ID を組み込めるようになっています。そのためユーザーは、複数のスキーマを指定し、指定したスキーマに従って妥当性が検証された XML 値のみを選択できるようになりました。DB2 V9.5 はさらに、列の代わりに XML 式をオペランドとして指定するという柔軟性も実現しています。以下は、customer テーブルから customer スキーマで妥当性が検証された文書のみを選択する例です。

リスト 17. SELECT 文での XML 妥当性検証制約
 db2 SELECT info FROM customer 
        WHERE info IS VALIDATED ACCORDING TO XMLSCHEMA ID customer

注釈付き XML スキーマ分解

DB2 9 では、再帰的スキーマを制約してデータをリレーショナル・テーブルに分解できるように XML スキーマの注釈をサポートしていましたが、DB2 V9.5 では再帰的スキーマの制約が撤廃されています。現在は、スキーマが再帰的であったとしても、ユーザーがデータに注釈を付けてデータを分解できるようになりました。

DB2 V9.5 では、挿入順序を指定できるようにスキーマ分解が拡張されています。挿入順序の指定は、データが外部キー・リレーションを持つ複数のテーブルに分解される場合に重要な意味を持ちます。この場合、参照制約を維持するためには、最初に主テーブルにデータが設定される必要があるからです。挿入の順序は、以下の注釈を使用して指定することができます。

リスト 18. 挿入順序を指定するスキーマ注釈
<db2-xdb:rowSetOperationOrder xmlns:db2-xdb="http://www.ibm.com/xmlns/prod/db2/xdb1">
  <db2-xdb:order>
    <db2-xdb:rowSet>CUSTOMER</db2-xdb:rowSet>
    <db2-xdb:rowSet>PURCHASEORDER</db2-xdb:rowSet>
  </db2-xdb:order>
</db2-xdb:rowSetOperationOrder>

サンプル・コード recxmldecomp.db2 および recxmldecomp.db2 にはそれぞれ、再帰的スキーマに注釈を付けて分解する例、テーブルへの挿入順序を指定する例が記載されています。これらのサンプル・コードは、sqllib/samples/xml/clp ディレクトリーにあります。

XML 索引の機能強化

DB2 9 で導入された XML 索引は、データベースに保管された XML 文書の特定ノードに作成することができます。索引のデータ型は VARCHAR、DOUBLE、DATE、または TIMESTAMP のいずれかです。索引のデータ型が XML 文書の要素のデータ型と一致しない場合、DB2 は XML 値を挿入しますが、その特定の XML 値には索引が作成されません。

DB2 V9.5 では XML 索引用のもう 1 つの節、REJECT INVALID VALUES を追加しています。この節を指定して索引を作成する場合、索引のデータ型が挿入先の XML 文書の要素のデータ型と一致しなければ挿入操作は失敗します。一方、値が挿入された後に索引が作成される場合には、値と索引のデータ型が一致しない限り、索引は作成されません。

この振る舞いは DB2 V 9.5 でデフォルトに設定されていますが、IGNORE INVALID VALUES 節を使って明示的に指定することもできます。

以下は、REJECT INVALID VALUES オプションを指定して customer テーブルの Cid 属性に索引を作成する例です。

リスト 19. XML 索引
db2 CREATE INDEX index1 ON customer(info) 
     GENERATE KEY USING XMLPATTERN 
        'declare default element namespace "http://posample.org";
         /customerinfo/@cid' as SQL DOUBLE REJECT INVALID VALUES

索引アドバイザーおよびオプティマイザーの機能強化

索引アドバイザーを使用すると、XML データとリレーショナル・データの両方に索引を付ける場合の推奨案を表示することができます。XML データとリレーショナル・データの両方に索引機能を使用することで、ユーザーは大幅にパフォーマンスを向上させることができます。一方、DB2 9.5 オプティマイザーは XML とリレーショナル両方の索引を使用してクエリーを最適化し、クエリーの実行に最適な案を選択できるよう支援します。

DB2 Data Web サービス

DB2 V9.5 の XML データは、Data Web サービスを使用してデータベース操作言語 (ML) での操作用 Web サービスとして公開することもできます。Data Web サービス (DWS) は挿入、更新、選択、そしてストアード・プロシージャーなどの ML 操作を Web サービスとして公開します。公開されたこれらの Web サービスは、Web ブラウザーから SOAP over HTTP、POST および GET などを使用するか、またはカスタム・クライアントを使って利用できます。Data Web サービスは、既存のデータベース・ツールに統合された Eclipse ベースのツールでサポートされます。

コントロール・センターも XML データに対応するように更新されています。

まとめ

DB2 9 は XML を新しいデータ型として採用し、XML 値を扱うための基盤を提供しました。DB2 V9.5 では、DB2 9 で提供された XML 文書に対するクエリーの実行、スキーマの登録や XML 文書の妥当性の検証、そして SQL/XML による SQL と XQuery の相互の作用などの基本的な機能を強化するとともに、XML データを効率的に操作する機能をさらに充実させています。

謝辞

テクニカル・レビューによりこの記事に関する貴重なコメントを提供してくださった Matthias Nicola 氏、Susan Malaika 氏、Cindy Saracco 氏、Henrik Loeser 氏、そして ID レビューで協力してくれた Mel 氏に感謝します。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management, XML
ArticleID=271087
ArticleTitle=新しくなった DB2 バージョン 9.5 での pureXML 機能強化の概要
publish-date=11012007