目次


カンタン!DB2テクテク第1歩 拡張機能編

DB2 XMLエクステンダー:第2話

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: カンタン!DB2テクテク第1歩 拡張機能編

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:カンタン!DB2テクテク第1歩 拡張機能編

このシリーズの続きに乞うご期待。

はじめに

DB2テクテク第1歩 XMLエクステンダー編の第2回目となる今回は、XMLエクステンダーを使うための準備についてお話します。また、前回お話した2つあるXML文書保存方法のうち、XML列について実際にデータの保存と、参照を行ってみたいと思います。

ここで示す例はマニュアル「XMLエクステンダー 管理およびプログラミングの手引き」の「XMLエクステンダー入門」に記載されているチュートリアルに基づいています。

Windowsの場合、「スタート」→「プログラム」→「IBM DB2」→「コマンド・ウィンドウ」から、以下の例を実行してください。

Unixの場合、ターミナルのコマンド行から以下の例を実行してください。

XMLエクステンダー使用のための準備

図1.XMLエクステンダー使用準備の流れ
図1.XMLエクステンダー使用準備の流れ
図1.XMLエクステンダー使用準備の流れ

解説:XMLエクステンダー使用のための準備

図1はXML列を構成するまでの流れを示しています。

XMLエクステンダーを使用するためには、下記の手順に従う必要があります。

  1. XML文書を保管するためのデータベースがまだ作成されていない場合、データベースを作成します。
  2. データベースにXMLエクステンダーのストアド・プロシージャおよびDB2 CLIのバインドファイルをバインドします。
  3. XMLエクステンダーのコマンドによりデータベースを使用可能にします。
  4. XMLデータを保管する場合、データベース内にXMLデータを保管するための表を作成します。既存の表からXMLデータを合成する場合は表を作成する必要はありません。

XML列を使用して、サイド表を作成するには(1)〜(4) に続いて以下の操作が必要です。

  1. (オプション)XML列 に保管するXML文書の妥当性検査を行う場合、DTD_REF表にDTDを保管することができます。
  2. サイド表の定義を含むDADファイルを作成します。
  3. XMLエクステンダー のコマンドにより、作成したDADファイルでXML列 を使用可能にします。

XMLコレクションを使用する場合は(1)〜(4) に続いて以下の操作が必要です。

  1. (オプション) XML文書を合成し、その合成したXML文書の妥当性検査を行う場合、または、XML文書を分解する際に分解する前にXML文書の妥当性検査を行う場合には、DTD_REF表にDTDを保管することができます。
  2. XMLデータとDB2の表・列とのマッピング情報をDADファイルの中に記述します。
  3. XMLエクステンダーのコマンドにより、作成したDADファイルでXMLコレクション を使用可能にします。 または、コマンドでXMLコレクション を使用可能にしなくても、DADファイルを指定することでXML文書の分解・合成をすることも可能です。

さて、ここからはXMLエクステンダーに付属されているサンプルを用いて、実際の構成手順を見ていきます。

サンプルファイルは

(windowsの場合) (installdir)\samples\cmd
(UNIX/Linuxの場合)(installdir)/samples/cmd

ディレクトリに入っています。(installdir)は製品をインストールしたディレクトリで、デフォルトでは

(windowsの場合) C:\dxx
(AIXの場合) /usr/lpp/db2xml_07_01/

になります。

XMLエクステンダー使用のための準備‐DBの準備

getstart_db.cmdの実行

  • ここでの作業は図1の(1)にあたります。
  • getstart_db.cmdファイルは、SALES_DBという名前のデータベースを作成し、さらにorder_tab表、part_tab表、ship_tab表、result_tab表を作成します。
  • また、order_tab表、part_tab表、ship_tab表に対してデータの挿入を行います。(result_tab表は合成したXML文書を保管するための表なので、ここではデータの挿入は行いません。)
  • getstart_db.cmdの内容(Windows版)
db2 "create database SALES_DB"  ←データベースの作成
db2 "connect to SALES_DB"

db2 "echo -------- Setting up the database SALES_DB --------"
db2 "create table order_tab
(order_key integer, customer_name varchar(16), ←表の作成 db2 "create table part_tab
(part_key integer, color char(6), quantity integer,
price decimal(10,2), tax real, order_key integer) db2 "create table ship_tab
(date date, mode char(6), comment varchar(64), part_key integer)" db2 "create table result_tab(doc varchar(2000))" db2 "insert into order_tab values
(1, 'American Motors', 'parts@am.com', '800-AM-PARTS')" db2 "insert into part_tab values
(156, 'red', 17, 17954.55, 0.02, 1)" db2 "insert into part_tab values
(68, 'black', 36, 34850.16, 0.06, 1)" ←データの挿入 db2 "insert into part_tab values
(128, 'red', 28, 38000.00, 0.07, 1)" db2 "insert into ship_tab values
('1998-03-13', 'TRUCK', 'This is the first
shipment to service of AM.', 156)" db2 "insert into ship_tab values
('1999-01-16', 'FEDEX', 'This the second
shipment to service of AM.', 156)" db2 "insert into ship_tab values
('1998-08-19', 'BOAT', 'This shipment is requested
by a call. from AM marketing.', 68)" db2 "insert into ship_tab values
('1998-08-19', 'AIR', 'This shipment
is ordered by an email.', 68)" db2 "insert into ship_tab values
('1998-12-30', 'TRUCK', NULL, 128)" db2 "terminate"

XMLエクステンダー使用のための準備‐DBのバインド

getstart_prep.cmdの実行

  • ここでの作業は図1の(2)、(3)にあたります。
  • getstart_prep.cmdファイルは、SALES_DBデータベースに対してバインドを実行し、dxxadmコマンドを使用してXMLを使用可能化します。
  • getstart_prep.cmdの内容(Windows版)
 
db2 "connect to SALES_DB"

cd /d %DB2DXXPATH%\bnd  ←データベースのバインド
db2 "bind @dxxbind.lst"
cd /d %DB2PATH%\bnd
db2 "bind @db2cli.lst"

db2 "terminate"

cd /d %DB2DXXPATH%\samples\cmd
dxxadm enable_db SALES_DB  ←データベースの使用可能化

(注) バインド実行時に「SQL0204N "DB2XML.XML_USAGE"は未定義の名前です。」と出力され、「SQL0091N バインドが、エラー"0"と警告"1"で終了しました。」となりますが、本ドキュメントで記述する使用例の実施には影響ありません。

XML列の使用例

図2.XML列の使用例
図2.XML列の使用例
図2.XML列の使用例

解説:XML列の使用例

ここでは、以下のような条件のサンプルを考えます。

  • サービス部門用の営業データはXML形式である。
  • 営業データ全体をデータベースに保管する。
  • 顧客からの要求および苦情処理などのために保管したXML文書を検索する。
  • 検索頻度が高いXML文書の要素が通知されている。
  • XML文書全体を保管するために、XML Column を使用可能化した列Order を持つsales_tab表をSALES_DBデータベースに作成します。

また、検索を高速に行うために、検索頻度の高い要素はサイド表に抽出することにします。

次のような手順が必要です。

  • XML Columnを使用する表の準備
  • DTDファイルの準備
  • DADファイルの準備
  • XML Column の使用可能化
  • サイド表に対する索引作成
  • XML Column の使用

XML文書の構造と表の関係

図3.XML文書の構造と表の関係
図3.XML文書の構造と表の関係
図3.XML文書の構造と表の関係

解説:XML文書の構造と表の関係

図3はこのサンプルで使用するXML文書(getstart.xml)の構造を示しています。

このXMLファイルは

(windowsの場合) (InstallDir)\samples\xmlディレクトリー
(AIXの場合) /usr/lpp/db2xml_07_01/samples/xmlディレクトリー

にあります。

検索頻度が高い要素を高速に検索するために、サイド表に値を抽出することにします。

  • サイド表はXML列を使用可能にする時に、XMLエクステンダー により自動的に作成されます
  • 複数回出現可能な要素は各要素につきそれぞれ別のサイド表を定義して保管する必要があります。
  • ここでは、3つのサイド表を作成し、合計4種類の要素を抽出しています。
  • サイド表の定義はDADファイル(getstart_xcolumn.dad)で行います。
  • サイド表には、ターゲット表(XML文書が保管されている表)のPrimary Key と同じ値を持つ列が作成され、参照制約により、ターゲット表とサイド表が結び付けられます。

XML Column を使用可能化する際に、ターゲット表とすべてのサイド表を結合した視点(デフォルト視点)を作成することができます。これは、dxxadm enable_column コマンドの場合には -v オプションを指定することにより可能です。

デフォルト視点は、例えば以下のようになります。これは、前ページのsales_tab表と order_side_tab表、part_side_tab表、ship_side_tab表の各サイド表が結合されています。

デフォルト視点

INVOICE_NUMSALES_PERSONORDERORDER_KEYCUSTOMERPRICEDATE
CHAR(6)VARCHAR(20)XMLVARCHARINTEGERVARCHAR(16)DECIMAL(10,2)DATE

表の作成

getstart_createTabCol.cmd はsales_tab表を作成します。

ここでの作業は図1の(4)にあたります。

このsales_tab表に対して、ALTER TABLE でXML Column を使用するorder 列を追加するスクリプトが getstart_alterTabCol.cmdです。order 列はXML ExtenderのデータタイプであるXMLVarchar を指定しています。

ここでは、order 列の存在をはっきりさせるために、あえてALTER TABLE文で後から order 列を追加しています。order 列を後から追加せず、getstart_createTabCol.cmd で表を作成する時にorder 列を同時に作成しても、問題ありません。

getstart_createTabCol.cmd ファイルの内容(Windows版)

		        db2 "connect to SALES_DB"

db2 create table sales_tab(invoice_num char(6) not null primary key, sales_person varchar(20))sales_tab表の作成
db2 "terminate"

getstart_alterTabCol.cmd ファイルの内容(Windows版)

		        db2 "connect to SALES_DB"

db2 alter table sales_tab add order db2xml.xmlvarchar order列を追加 データタイプはXMLVarcharを指定
db2 "terminate"

DTDファイルの準備

ここでの作業は図1の(5)にあたります。

XMLエクステンダー ではXML列 にXML文書を挿入する時、あるいはXML列 に挿入されているXML文書を更新した時に、DTDを使用して妥当性の検査を行うことができます。

使用されるDTDは基本的にはXML文書のDOCTYPE宣言で指定されたDTDですが、妥当性検査を行うためのDTDファイルをDB2の中の表(DTD_REF表)に保管しておき、外部のDTDファイルを参照しなくても妥当性検査を行うことができるようにすることもできます。

「DTD_REF表に保管されているDTDのうち、どのDTDを使用するか」という指定はXML列 を使用可能化する時に使用するDADファイル内でDTDIDを指定することによってによって指定します。

DADファイル内に<dtdid>要素がある場合、DTD_REF表のDTDID列の値が<dtdid>要素で示される値の行に格納されているDTDが使用されます。

DADファイル内に<dtdid>要素がない場合、XML文書のDOCTYPE宣言に指定されているDTDファイルが使用されます。

従って、後ほど行うXML列 の使用可能化時に、DADファイル内にDTDIDが指定されている場合、DTD_REF表に該当するDTDIDを持つ行が存在しない場合には、XML列 の使用可能化がエラーとなってしまいます。

getstart_insertDTD.cmd は getstart.dtd という名前のDTDファイルをDTD_REF表に挿入します。挿入時にはXMLエクステンダーのUDFであるXMLClobFromFile関数を使用しています。

getstart_insertDTD.cmd ファイルの内容(Windows版)

    db2 "connect to SALES_DB"

cd /d %DB2DXXPATH%\samples\cmd

db2 "echo "
db2 "echo ----- Inserting the DTD into SALES_DB  "
db2 insert into db2xml.dtd_ref values('getstart.dtd',  DTD_REF表にDTDファイルを挿入db2xml.XMLClobFromFile
('%DB2DXXPATH%\samples\dtd\getstart.dtd'), 0,
'user1', 'user1', 'user1') db2 "terminate"

XML列の使用可能化

XML列の使用可能化には、DADファイルが必要です。

ここでの作業は図1の(6)にあたります。

(Windowsの場合) DADファイルは、%DB2DXXPATH%\samples\dad\getstart_xcolumn.dad を使用します。このファイルを %DB2DXXPATH%\samples\cmd ディレクトリにコピーします。

(AIXの場合) DADファイルは /usr/lpp/db2xml_07_01/samples/dad ディレクトリにあります。このファイルを /usr/lpp/db2xml_07_01/samples/cmd ディレクトリにコピーします。

XML列 を使用可能化するためには、dxxadm enable_column コマンドを使用します。

ここでの作業は図1の(7)にあたります。

getstart_enableCol.cmd はSALES_DBデータベースの sales_tab 表にある order 列に対して、getstart_xcolumn.dad ファイルによってXML列を使用可能化します。-vオプションを付けることで、サイド表を結合した sales_order_view という視点も作成します。

getstart_enableCol.cmd ファイルの内容(Windows版)

    db2 "connect to SALES_DB"

cd /d %DB2DXXPATH%\samples\cmd

rem  ----- Enabling the SALES_DB for XML column data
dxxadm enable_column  sales_db  sales_tab order  
%DB2DXXPATH%\samples\cmd\getstart_xcolumn.dad -vsales_order_view -r invoice_num        XML列の使用可能化 db2 "terminate"

DADファイル

DADファイル(getstart_xcolumn.dad)の内容は以下の通りです。

<?xml version="1.0"?>
<!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd">
<DAD>
<dtdid>getstart.dtd</dtdid>		←変更(必要な場合) 
<validation>YES</validation><Xcolumn>

 ↓サイド表order_side_tabの定義
   <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> 

↓サイド表part_side_tabの定義
   <table name="part_side_tab">
      <column name="price" 
         type="decimal(10,2)" 
         path="/Order/Part/ExtendedPrice" 
         multi_occurrence="YES"/>
   </table>
  
↓サイド表ship_side_tabの定義
   <table name="ship_side_tab">
      <column name="date" 
         type="DATE" 
         path="/Order/Part/Shipment/ShipDate" 
         multi_occurrence="YES"/>
   </table>
</Xcolumn>
</DAD>

サイド表への索引の作成

XML列 を使用可能化すると、DADファイルの指定に従ってサイド表が自動的に作成されます。

今回使用した getstart_xcolumn.dad では order_side_tab、part_side_tab、ship_side_tab の3種類のサイド表が作成されています。

このサイド表はXML文書の要素を高速に検索するために使用されるため、索引が作成されていると都合が良いのですが、XML Extender では自動的にサイド表に対して索引付けをしません。

従って、索引を作成する場合には手動で行う必要があります。

getstart_createIndex.cmd ではサイド表のそれぞれの列に対して索引を作成します。

getstart_createIndex.cmd ファイルの内容(Windows版)

    db2 "connect to SALES_DB"

echo --- Creating an index on the ORDER_KEY 
column in the side table ORDER_SIDE_TAB db2 "create index key_idx on order_side_tab(order_key)"
     ↑サイド表の各列に対して索引の作成 echo --- Creating an index on the CUSTOMER
column in the side table ORDER_SIDE_TAB db2 "create index customer_idx on order_side_tab(customer)" echo --- Creating an index on the PRICE
column in the side table PART_SIDE_TAB db2 "create index price_idx on part_side_tab(price)" echo --- Creating an index on the DATE
column in the side table SHIP_SIDE_TAB db2 "create index date_idx on ship_side_tab(date)" db2 "terminate"

XML文書のXML列への挿入

挿入するXML文書は%DB2DXXPATH%\samples\xml\getstart.xml です。必要な場合のみ、エディタでこのファイルを開き、DOCTYPE宣言のDTDファイルのパス名を変更します。

getstart_insertXML.cmd は使用可能化したXML列 にXML文書を挿入します。

挿入にはXMLエクステンダー のUDFであるXMLVarcharFromFile 関数を使用しています。

XML文書はsales_tab 表の order 列に蓄えられると同時に、DADファイルの指定に従って各サイド表にデータが挿入されます。

getstart_insertXML.cmd ファイルの内容(Windows版)

db2 "connect to SALES_DB"

cd /d %DB2DXXPATH%\samples\cmd

rem ----- Inserting the XML document into SALES_DB  ↓XML Columnを含む表に対してデータを挿入
db2 insert into sales_tab(invoice_num, sales_person, order) 
values('123456', 'Sriram Srinivasan', db2xml.XMLVarcharFromFile
('%DB2DXXPATH%\samples\xml\getstart.xml')) db2 "terminate"

XML列からのXML文書の検索

getstart_queryCol.cmd は挿入したXML文書に対して条件を指定して検索をする例です。

この例では、サイド表に抽出したデータに対して条件を指定して検索し、元表のデータと合わせて表示しています。価格が2500.00以上であるような注文データのSALES_PERSONを検索しています。

getstart_queryCol.cmd ファイルの内容(Windows版)

db2 "connect to SALES_DB"

cd /d %DB2DXXPATH%\samples\cmd
サイド表のデータに対して条件を指定し、元表と結合して結果を表示
rem ---------- Querying SALES_DB XML documents....
db2 "select distinct sales_person from sales_tab S, part_side_tab P where price > 2500.00 and S.invoice_num = P.invoice_num"

db2 "terminate"

getstart_queryCol.cmdによる検索結果

SALES_PERSON
--------------------
Sriram Srinivasan

    1 レコードが選択されました。

デフォルト視点からの検索

XML列 を使用可能化する際に、-v オプションを指定するとサイド表を結合した視点(デフォルト視点)を作成することができます。この視点を使用して検索を行うことが可能です。この場合、ターゲット表とサイド表の結合条件を記述する必要がありません。

次の例はExtendedPrice が2500.00以上である注文データの、SALES_PERSONをデフォルト視点sales_order_viewを使用して検索します。(前項の検索結果と同じ検索結果を、SQL文に表の結合条件を記述すること無く得ることができます。)

> SELECT distinct sales_person FROM 
sales_order_view WHERE price > 2500.00 SALES_PERSON -------------------- Sriram Srinivasan 1 レコードが選択されました。

XMLエクステンダー のextract UDFを使用すると、XML列 に保管されているXML文書の指定した要素のみを抽出することができます。抽出する要素が1回のみ出現するのか、複数回出現するかにより、使用するUDFが異なります。

1回のみ出現する要素に対してはextract UDF のスカラー関数を使用します。

次の例はsales_tab 表から INVOICE_NUM、SALES_PERSON とXML文書の中のCustomerのNameを表示します。

> SELECT invoice_num, sales_person, 
db2xml.extractVarchar(order, '/Order/Customer/Name') as customer FROM sales_tab INVOICE_NUM SALES_PERSON CUSTOMER ----------- -------------------- ------------------------------ 123456 Sriram Srinivasan American Motors 1 レコードが選択されました。

サンプル環境のクリーン・アップ

getstart_clean.cmd は使用可能化したXML列を使用不可能化し、作成した表を削除します。

getstart_clean.cmd ファイルの内容(Windows版)

db2 "connect to SALES_DB"

echo --- Cleaning up ......
@echo on
db2 "drop table order_tab"作成した表の削除
db2 "drop table part_tab"

db2 "drop table ship_tab"

db2 "drop table result_tab"

dxxadm disable_column sales_db sales_tab orderXML列の使用不可能化
db2 "delete from db2xml.dtd_ref where dtdid='getstart.dtd'"DTDの削除
db2 "drop table sales_tab"

db2 "terminate"

最後に

簡単シリーズXMLエクステンダー編第2回の今回は、XMLエクステンダーの諸機能を使用するために、データベースに対してする必要のある作業と、XML列を用いたXML文書の保管および検索について、XMLエクステンダー付属のサンプルを用いながら見てきました。

次回は、XML文書の保管・検索のもう一つの方法、XMLコレクションについて、サンプルを用いながら見て行きたいと思います。


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


関連トピック


コメント

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=320587
ArticleTitle=カンタン!DB2テクテク第1歩 拡張機能編: DB2 XMLエクステンダー:第2話
publish-date=11302005