DB2 XML Extender とは? (概要/XML Column)

DB2 XML Extender についてちょっと概略をご紹介したいと思います。


XML文書をいかにRDBで利用するか、というのがこの製品の主眼でしょう。

以下にご紹介するサンプルでもそうなのですが、主に想定されている状況としては、XML文書そのものがオーダーかなにかのかたちで来るのをどう管理しようか、といったような状況のように思います。
例えば、B2Bでのやりとりに使用される一回の発注や受注がXML文書のかたちで来て、それはこちら側でそのままRDBのカラムに格納して今後の参照に使用する/分解して関連したRDBのテーブルに格納する、といった状況がまず最初に考えられている、と言えそうです。

DB2 XML Extender の実体は、XMLを扱うための、ユーザー定義タイプ(UDT)、ユーザー定義ファンクション(UDF)、ストアド・プロシージャなどのデータベースオブジェクトの集合体です。まさしく、その意味ではデータベースの拡張ですの"Extender"という名称は当を得ていると言えます。
大きく分けると以下の3つの機能があります。

この場合、オーダー番号がキーになって、取り扱い者、XML文書そのもの、という3つのカラムでできたテーブルなんかが考えられます。
XMLの各要素を高速に検索できるようにサイドテーブルといったかたちで、要素を分解して実際に抽出した値を持っているテーブルを検索用に作成できます。
この保管方法を"XML Column"といいます。

この場合には、その分解条件がほとんど変わらないケースとかなり頻繁に変更されるケースが予想されます。
分解の仕方を書いた文書を、関連付けられたテーブルでXML文書の分解/格納時に自動的にチェックしてもらうやりかた、と
その分解の仕方を書いた文書をXML文書の分解/格納時にその都度指定してやるやりかたの2つがあります。

いずれのケースにしても、XML文書のテーブルへの格納時にDTDとのチェックを行うことが可能です。(もちろんチェックを行わないことも可能です)

この保管方法を"XML Collection"といいます。

その"XML Collection"には2つのやり方があり、
「分解の仕方を書いた文書を、関連付けられたテーブルでXML文書の分解/格納時に自動的にチェックしてもらうやりかた」を「コレクション名を指定するやりかた」といい、
「その分解の仕方を書いた文書をXML文書の分解/格納時にその都度指定してやるやりかた」を「DADファイル名を指定するやりかた」といいます。

RDBのテーブルから、カラムを関連づけてXML文書を合成することが可能です。
合成されたXML文書は、この「3つの機能」の中で挙げられた最初の「XML文書をそのままRDBの専用のカラムにまるごと格納する」のかたちでテーブルに格納されます。

いずれのケースでもXML文書の各要素とRDBのテーブル/カラムとの関連を定義する必要がありますが、それを行うのがDAD(Data Access Definition)と呼ばれるものになります。


このサイトでの「DB2 XML Extender」関連の記事について、ひとつ注意をお願いしたいことがあります。

この一連の記事で、DADファイルを含む関連したXMLファイルをリンクとして表示するようにしてありますが、リンク先のXML文書を正しく表示させるため、DTD文書の場所を相対パスで指定するようにしています。
具体的に言うと、各ファイルのDTDの指定は"/dxxsamples/..."で始まっていますが、リンク先においてあるものはすべてこの先頭の"/"がないものになっています。

これはこちらのWebサイトに置く場合に相対パスにせざるを得ないのでそうしただけなのですが、例にあげたイメージやSQL文などではそのまま"/"があるかたちになっているものを実行した結果を載せています。

DTD_REFなどでの指定では、この最初の"/"のあるなしで格納されているDTD文書の検索が失敗してしまいますので、実は、これは小さなことではありません。そう意味で、以後の例に、この部分に関してSQL文との不一致がありますので、よろしくご承知おきの上ご参照くださいませ。

また、もうひとつ、あんまり歓迎したくないスペックなのですが、使用されるDTDやXML文書はすべてジョブのCCSIDと同じCCSIDを持っていないと正しく処理されないようです。
こちらの一連の記事でもそのスペックにあうようにして実行していますが、今後この制限がなくなっても (ほんとに早くなくなってほしい...) この記事が有効なように、また DB2 XML Extender 自体の使用法をよりわかりやすく紹介するために、そういった部分は省略しています。こちらもよろしくご承知おきの上ご参照ください。


XML Column の場合

XML Column の場合を例にとって、どんなかんじで使用するのかを追ってみましょう。

データベースの使用可能化

まず最初にデータベース自体でこのDB2 XML Extenderを使用できるようにします。
ちょっと詳細に言うと、その実体であるユーザー定義タイプやユーザー定義ファンクション、ストアドプロシージャを作成してこのデータベースで使用できるようにすることです。

セットアップはそんなに難しくありません。
こちらを参照ください。

DTDのDTD_REFテーブルへの保管

DTD_REFテーブルというものがDB2XMLスキーマに作成されますが、これはXML文書をRDBに格納する際に形式のチェックを行うDTDを格納しておくテーブルです。

チェック(Validation)を行うかどうかはDADで記述します。<validation>YES</validation>が指定されていればチェックが行われます。

XMLカラムの定義

新しく"ORDER"という名前でXML文書をまるごと格納するためのカラムを追加します。(ここはALTER TABLEで既存のテーブルの変更を行っていますが、もちろん最初から指定して作成してもかまいません)

「ORDER」はSQLの予約語なので"で囲って使用します。

DADの作成

XML Columnの使用可能化の時にDADファイルを指定します。

先ほどすこしだけ触れましたが、XML文書をどう取り扱ってRDBと関連付けるか、を記述するものです。これ自体がXML文書の形になっています。

チェックに使用するDTDファイルの名前(<dtdtid>)、チェックを行うかどうか(<validation>)、後で検索に使用したい要素の指定などを行います。

Notepadなどで作る/XMLエディタなどで作る/XML管理ウィザードを使用する、といった手段を使用して作成します。

<?xml version="1.0"?>
<!DOCTYPE DAD SYSTEM "/dxxsamples/dtd/dad.dtd">
<DAD>
<dtdid>/dxxsamples/dtd/getstart.dtd</dtdid>
<validation>YES</validation>
<Xcolumn>
  <table name="order_side_tab">
   <column name="order_key"
     type="integer"
     path="/Order/@key"
     multi_occurrence="NO"/>
   <column name="customer"
     type="varchar(50)"
     path="/Order/Customer/Name"
     multi_occurrence="NO"/>
  </table>
  <table name="part_side_tab">
   <column name="price"
     type="decimal(10,2)"
     path="/Order/Part/ExtendedPrice"
     multi_occurrence="YES"/>
  </table>
  <table name="ship_side_tab">
   <column name="date"
     type="DATE"
     path="/Order/Part/Shipment/ShipDate"
     multi_occurrence="YES"/>
  </table>
</Xcolumn>
</DAD>

XML Columnの使用可能化

XML文書を格納することにしたカラムの使用可能化(enable_column)を行います。

このXMLカラムの使用可能化を行うことによって、指定されたDADによって指示された処理が行われるようになります。
例えば、新規XML文書をINSERTする時に指示されたDTDファイルによってValidationを行うかどうか、またXML文書の各要素を迅速に検索するために必要なサイドテーブルの定義がある場合はそのメインテナンスもXML文書のINSERT時に行われます。

この時に実行しているユーザー名と同じSCHEMA(=ライブラリー)にサイドテーブルを作成しようとします。そのSCHEMAが存在しない場合はエラーになってしまいます。
XMLDEMOという名のユーザーで実行していますので、XMLDEMOというライブラリー(=SCHEMA)にDADに記述されている3つのサイドテーブル(order_side_tab/part_side_tab/ship_side_tab)が作成されます。

DADファイルで<validation>YES</validation>を指定した時は、<dtdtid>/dxxsamples/dtd/getstart.dtd</dtdtid>で指定されているものと一字一句異ならない文字がDTD_REFテーブルで見つからないと DXXA010E エラー("Attempt to find DTD ID failed")になってしまいます。DTD_REFテーブルに行を挿入する時、例えば最初の"/"を入れ忘れてしまっただけでもこのエラーになってしまうので注意してください。

サイドテーブルは実際のデータを持っています。(Viewではありません)
検索を柔軟に速く行うためにサイドテーブルを作成するので、インデックスを作成しておいた方が効果的です。以上のようにそれぞれインデックスを作成しておきます。

XML Column へのXML文書の格納

INSERT文を使用してカラムにXML文書を格納します。先ほど紹介したDADに従うようにXML Columnを使用可能化したので、この時にXML文書の形式チェックも行われます。また、サイドテーブルへの値の格納も行われます。

XML文書の中の要素も含めて内容を表示してみましょう。
XML文書が格納されているカラムである order から <Order><Customer><Name>のツリーの要素から ExtractVarchar(UDF)を使用して(CUSTOMERというカラム名として)値を抽出しています。

結果はこんなかんじです。

[Top Pageに戻る]

Ads by TOK2