Comments
Description
Transcript
DB2 XMLエクステンダー Data Management Software
DB2 XMLエクステンダー Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group 第3話 第1話 XMLエクステンダーとは XML文書の保管方法 DTDの保管 製品構成 第2話 XMLエクステンダー使用のための準備 XML列の使用例 第3話 XMLコレクションの概要 RDB_nodeマッピングによるXMLの分解 第4話 XML文書合成の例 RDB_nodeマッピングによる合成 SQLマッピングによる合成 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group はじめに 前回は、XMLエクステンダーを使うための準備と、使い方の一つであるXML列の使用について見てみました。 もう一つのXML文書の保存方法であXMLコレクションについて、今回と次回の2回にわたり見ていきたいと思います。今 回は特に、XML文書の分解について見ていきましょう。 ここで示す例は製品に付属してくるsampleファイルに基づいています。 Windowsの場合、「スタート」→「プログラム」→「IBM DB2」→「コマンド・ウィンドウ」から、以下の例を実行してください。 Unixの場合、ターミナルのコマンド行から例を実行してください。 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group XMLコレクションの概要 XML文書の要素/属性の値のみを取り出して、リレーショナル表に保管する、またはリレーショナル表の値をもとにXML 文書を合成するための一連のマッピング定義をXMLコレクション と呼びます。 DB2 XMLエクステンダー ではXML 文書の各要素/属性の値を取り出してリレーショナル表に保管すること(ここでは分解 と呼ぶ)、およびリレーショナル表の値をXML文書の各要素/属性の値としてXML文書を組み立てること(ここでは合成と 呼ぶ)の両方をサポートしています。 分解の方式には、RDB_node マッピングと呼ばれる、XML文書のロケーションパスに基づいた方式のみが使用可能で す。 合成の方式には、分解と同じくRDB_node マッピングのほかに、SQL文によりどの表のどの列の値をXML文書の要素/属 性の値として用いるかを指定するSQL マッピングと呼ばれる方式も使用可能です。 それぞれのマッピング方式について、分解・合成ストアド・プロシージャの引数として、コレクション名を指定する方法と DADファイル名を直接指定する方法があります。コレクション名を指定する場合には、enable_collection コマンドであらか じめDADファイルに対応するコレクション名を登録する必要があります。 マッピング方式 ストアド・プロシージャの引数 コレクション名 XML文書の分解 RDB_node マッピング RDB_node マッピング DADファイル名 コレクション名 DADファイル名 XML文書の合成 コレクション名 SQL マッピング DADファイル名 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group RDB_nodeマッピングによるXML文書の分解 XML 文書の分解のシナリオ 注文データであるXML文書の各要素を分解して、SALES_DBのorder_tab表、part_tab表、ship_tab表にそれぞれXML 文書の要素/属性の値のみを挿入します。 値に条件を設定し、その条件を満たす値のみを挿入することも可能です。 XML文書の各要素/属性と保管する各表・列のマッピングの定義をDADファイル内に指定します。 サービス部門用 営業データ DADファイル 営業データ保管用データベース neworder1.dad SALES_DB XML文書 分解ストアド・ プロシージャー order_tab表 part_tab表 ship_tab表 neworder1.xml 図1.RDB_nodeマッピングによるXML文書の分解 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group 解説:RDB_nodeマッピングによるXML文書の分解 ここでは、以下のような条件のサンプルを考えます。 サービス部門用の営業データは定型のXML形式とします。 データベースに保管するデータは、XML文書の要素名/属性名(タグ)は含まず、値のみを保管します。 ここでは、XML文書の要素/属性の値のみを保管するために、XMLコレクション を使用してXML 文書をorder_tab 表、part_tab表、ship_tab表に分解します。 値に条件を設定し、その条件を満たす値のみを挿入することも可能です。 各要素/属性とその値が保管される表・列のマッピング情報はDADファイル(neworder1.dad)内で定義されます。 このDADファイルの定義をもとに、XMLエクステンダー が提供するストアド・プロシージャを使用して、XML文書の分 解を行うことができます。 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group XML文書の構造と表の関係 属性 1回出現する要素 Order Key + 1回以上出現する要素 Part Customer Name Email Color Key ? 0回または1回出現する要素 + Quantity ExtendedPrice Tax Shipment + ShipDate ShipMode Comment ? DADファイル(neworder1.dad) PRICE > 2500.00 order_tab表 part_tab表 ORDER_KEY CUSTOMER_NAME CUSTOMER_EMAIL INTEGER VARCHAR(16) VARCHAR(16) ship_tab表 COLOR PART_KEY PRICE TAX QTY O_KEY CHAR(6) INTEGER DECIMAL(10,2) REAL INTEGER INTEGER SHIP P_KEY VARCHAR(250) INTEGER 図2.XML文書の構造と表の関係 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group 例で使用するDTDとXML文書 neworder1.xml <?xml version="1.0"?> <!DOCTYPE Order SYSTEM "c:¥dxx¥dtd¥neworder.dtd"> neworder1.dtd <?xml encoding="US-ASCII"?> <!ELEMENT <!ATTLIST <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ATTLIST <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT Order (Customer, Part+)> Order Key CDATA #REQUIRED> Customer (Name, Email)> Name (#PCDATA)> Email (#PCDATA)> Part (Key, Quantity, ExtendedPrice, Tax, Shipment+)> Key (#PCDATA)> Quantity (#PCDATA)> ExtendedPrice (#PCDATA)> Tax (#PCDATA)> Part Color CDATA #REQUIRED> Shipment (ShipDate, ShipMode, Comment?)> ShipDate (#PCDATA)> ShipMode (#PCDATA)> Comment (#PCDATA)> Data Management Software <Order Key="1"> <Customer> <Name>American Motors</Name> <Email>[email protected]</Email> </Customer> <Part Color="red"> <Key>68</Key> <Quantity>36</Quantity> <ExtendedPrice>34850.16</ExtendedPrice> <Tax>0.06</Tax> <Shipment> <ShipDate>1998-08-19</ShipDate> <ShipMode>BOAT</ShipMode> </Shipment> <Shipment> <ShipDate>1998-08-20</ShipDate> <ShipMode>AIR</ShipMode> </Shipment> </Part> <Part Color="red"> <Key>128</Key> <Quantity>28</Quantity> <ExtendedPrice>38000.00</ExtendedPrice> <Tax>0.07</Tax> <Shipment> <!-- This shipment will not be inserted. --> <ShipDate>1961-01-01</ShipDate> <ShipMode>BOAT</ShipMode> </Shipment> <Shipment> <ShipDate>1998-12-30</ShipDate> <ShipMode>TRUCK</ShipMode> </Shipment> </Part> </Order> Systems Solution & Web Server Competence Center No.1 & No.4 DM Group 解説:例で使用するDTDとXML文書 「コレクション名を指定する方式」サンプル(後述)では、以下のXML文書(neworder1.xml)を使用しています。 このXML文書は、 Windowsの場合: (Install_Dir)\samples\xmlディレクトリ Unixの場合: (Install_Dir)/samples/xmlディレクトリ にあります。 (Install_Dir)はデフォルトでは Windowsの場合: C:\dxx AIXの場合: /usr/lpp/db2xml_07_01 Sunの場合: /opt/IBMdb2xml/V7.1 Linuxの場合: /usr/IBMdb2xml/v7.1 です。 XML文書を分解して、order_tab表、part_tab表、ship_tab表に保管します。 XML文書の要素名/属性名(タグ)は保管されません。 XML文書とリレーショナル表の列とのマッピングはDADファイル(neworder1.dad)の中で図2のように定義されていま す。 PRICE列に挿入する値には、「2500.00より大きい値のみ」という条件が設定されています。 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group XML文書分解の方式 XML 文書分解の方式には2通りの方式が用意されており、それぞれ異なるストアド・プロシージャを使用することに なります。 一つはコレクション名を指定する方式です。 この方式では、enable_collection コマンドによりDADファイルに対応するコレクション名を登録する必要がありま す。 コレクション名を登録するとDADファイルがXML エクステンダーの管理表内に保管されるため、XML文書を分解 する際にDADファイルを指定しなくても、最初に指定したXMLコレクションの名前を指定するだけで済みます。 また、DADファイルに指定した表があらかじめ作成されていない場合には、enable_collection コマンドを実行した 際に、XML エクステンダーによりそれらの表が自動的に作成されます。 dxxInsertXML ストアド・プロシージャを使用します。 もう一つは、XML文書を分解する際に、DADファイル名を指定する方式です。 enable_collection コマンドを実行する必要はなく、XML文書の分解時には、コレクション名のかわりにDADファイ ルの内容を直接指定してストアド・プロシージャを実行します。 分解する条件が頻繁に変更される場合などには、一般的に上記の方式よりオーバーヘッドが少なくなります。 分解したデータを保管する表は、分解時には存在している必要があります。 dxxShredXML ストアド・プロシージャを使用します。 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group データベースの準備 サンプルファイルを実行する前に、第2話で触れました「 XML Extender を使用するための準備」の(1)~(3)のステッ プを実行して、データベースの作成、バインドの実施、XML使用可能化を行う必要があります。 ここで用いるMYDBというデータベースには、データベース作成スクリプトおよびXML使用可能化のスクリプトが用 意されていないので、次の手順で準備します。 MYDBの作成 次のSQLコマンドを発行します。 db2 "create database MYDB" データベースのバインドおよびMYDBのXML使用可能化 第2話で用いたgetstart_prep.cmdを利用します。元のgetstart_prep.cmdファイルの中で、データベース名に SALES_DBと指定されていた部分をMYDBに修正して実行します。 db2 "connect to MYDB" cd /d %DB2DXXPATH%\bnd db2 "bind @dxxbind.lst" cd /d %DB2PATH%\bnd db2 "bind @db2cli.lst" この2ヶ所をSALES_DBから MYDBに修正します db2 "terminate" cd /d %DB2DXXPATH%\samples\cmd dxxadm enable_db MYDB Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group コレクション名を指定する方法 まずは、コレクション名を指定するサンプルを見てみましょう。 コレクション名を指定するサンプルは、insertxml.cmd サンプル・ファイルに記述されています。 insertxml.cmd内では、以下のステップが実行されます。 a. 分解するXMLファイルの妥当性検査を行う場合(DADファイル内でvalidationをYESに指定した場合)は、使用する DTDファイル(neworder1.dtd)をDTD_REF表に挿入します。 b. enable_collection コマンドをDADファイルを指定して実行し、XMLコレクションに名前をつけて XMLコレクションを登 録します。この際に分解するデータを格納する表がXMLエクステンダーにより自動的に作成されます。ここでは、 neworder1.dadファイルを指定し、XMLコレクションに「abc」という名前をつけて登録しています。 c. dxxInsertXML ストアド・プロシージャを使用してXML文書の分解を行います。 *実際には、内部でdxxInsertXMLストアド・プロシージャを使用するinsertxというプログラムを使用して、XML文 書の分解・MYDBへの挿入を行っています。insertxプログラムの内容は以下のファイルで確認できます。 Windowsの場合: (Install_Dir)\samples\c\insertx.sqx Unixの場合: (Install_Dir)/samples/c/insertx.sqx d. 分解したデータを確認するために、SELECT文により表の内容を確認します。 e. 作成した表をドロップし、DTDファイルのエントリを削除して、作成した環境を削除します。 f. disable_collection コマンドにより、XMLコレクションの登録を削除します。 ここで使用するDADファイルは以下のファイルになります。 Windowsの場合: (Install_Dir)\samples\dad\neworder1.dad UNIXの場合: (Install_Dir)/samples/dad/neworder1.dad Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group コレクション名を指定する方法-サンプル・スクリプト insertxml.cmd ファイルの内容(Windows版) @echo off rem rem insertxml -- test dxxInsertXML() for partial decomposition rem db2 "connect to mydb" a db2 "insert into db2xml.dtd_ref values('neworder.dtd', db2xml.XMLClobFromFile('%DB2DXXPATH%¥samples¥dtd¥neworder.dtd'), 0, 'anita', 'anita','anita')" b db2 "echo -------- Enabling collection abc. --------" dxxadm enable_collection mydb abc %DB2DXXPATH%¥samples¥dad¥neworder1.dad db2 "echo -------- Calling the dxxInsertXML stored procedure. --------" insertx mydb abc %DB2DXXPATH%¥samples¥xml¥neworder1.xml d db2 "select * from order_tab" db2 "select * from part_tab" db2 "select * from ship_tab" db2 db2 db2 db2 "echo -------- Cleaning up the database mydb. --------" drop table order_tab drop table part_tab drop table ship_tab c e f dxxadm disable_collection mydb abc db2 "delete from db2xml.dtd_ref where dtdid='neworder.dtd'" db2 terminate Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group コレクション名を指定する方法-DADファイル neworder1.dad ファイルの内容(Windows版:抜粋) <?xml version="1.0"?> <!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd"> <DAD> <validation>NO</validation> <Xcollection> <prolog>?xml version="1.0"?</prolog> <doctype>!DOCTYPE Order SYSTEM "c:\dxx\samples\dtd\neworder.dtd"</doctype> <root_node> <element_node name="Order"> <RDB_node> <table name="order_tab" key="order_key"/> <table name="part_tab" key="part_key"/> <table name="ship_tab" key="ship"/> <condition> order_tab.order_key=part_tab.o_key AND part_tab.part_key=ship_tab.p_key </condition> </RDB_node> <attribute_node name="Key"> <RDB_node> <table name="order_tab"/> <column name="order_key" type="integer"/> </RDB_node> </attribute_node> <element_node name="Customer"> <element_node name="Name"> <text_node> <RDB_node> <table name="order_tab"/> <column name="customer_name" type="varchar(16)"/> </RDB_node> </text_node> </element_node> Data Management Software 分解する表の定義 Name要素のマッピング定義 Systems Solution & Web Server Competence Center No.1 & No.4 DM Group コレクション名を指定する方法-実行結果 insertxml.cmdの実行結果より、元となるXML文書が分解されてリレーショナル表に格納されたことを見ることができます。 db2 "select * from order_tab" ORDER_KEY CUSTOMER_NAME CUSTOMER_EMAIL ----------- ----------------- ---------------1 American Motors [email protected] db2 "select * from part_tab" COLOR PART_KEY PRICE ------- ----------- --------red 68 34850.16 red 128 38000.00 TAX QTY O_KEY -------------- --------- ----------+6.00000E-002 36 1 +7.00000E-002 28 1 db2 "select * from ship_tab" SHIP P_KEY ------------------------------------------------ ------------------------------<Shipment> <ShipDate>1998-08-19</ShipDate> <ShipMode>BOAT</ShipMode> </Shipment> 68 <Shipment> <ShipDate>1998-08-20</ShipDate> <ShipMode>AIR</ShipMode> </Shipment> 68 (後略) Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group DAD名を指定する方法 DADファイル名を指定するサンプルは、shredxml.cmd サンプル・ファイルに記述されています。 サンプル・ファイル内では、以下のステップが実行されます。 a. 分解したデータを保管するための表(order_tab表、part_tab表、ship_tab表)を作成します。これらの表は分解する ストアド・プロシージャを実行する前に作成しておかなくてはなりません。また、表の列名、列の数、データタイプな どはDADファイル内の指定と一致していなくてはなりません。 b. dxxShredXML ストアド・プロシージャを使用してXML文書の分解を行います。引数に指定するのはDADファイルと 分解するXML文書の名前です。 *実際には、内部でdxxShredtXMLストアド・プロシージャを使用するshredというプログラムを使用して、XML文 書の分解・MYDBへの挿入を行っています。shredプログラムの内容は以下のファイルで確認できます。 Windowsの場合: (Install_Dir)\samples\c\shred.sqx Unixの場合: (Install_Dir)/samples/c/shred.sqx c. 分解したデータを確認するために、SELECT文により表の内容を確認します。 d. 作成した表をドロップして、作成した環境を削除します。 ここで使用するDADファイルは以下のファイルになります。 Windowsの場合: (Install_Dir)\samples\dad\neworder2.dad UNIXの場合: (Install_Dir)/samples/dad/neworder2.dad Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group DAD名を指定する方法-サンプル・スクリプト shredxml.cmd ファイルの内容(Windows版) @echo off rem rem shredxml -- test dxxShredXML for composite primary and foreign keys rem for existing tables. rem db2 "connect to mydb" a db2 "echo -------- Setting up the database mydb. --------" db2 "create table order_tab(order_key1 integer, order_key2 integer, order_key3 integer, customer_name varchar(16), customer_email varchar(16))" db2 "create table part_tab(part_key1 integer, part_key2 integer, color char(6), qty integer, price decimal(10,2), tax real, o_key1 integer, o_key2 integer, o_key3 integer)" db2 "create table ship_tab(date date, mode char(6), comment varchar(128), p_key1 integer, p_key2 integer)" db2 "echo -------- Calling the dxxShredXML stored procedure. --------" shred mydb %DB2DXXPATH%¥samples¥dad¥neworder2.dad %DB2DXXPATH%¥samples¥xml¥neworder2.xml db2 db2 db2 db2 "echo -------"select * from "select * from "select * from db2 db2 db2 db2 "echo "drop "drop "drop b Displaying the result of the decomposition. --------" order_tab" part_tab" c ship_tab" -------- Cleaning up the database mydb. --------" d table order_tab" table part_tab" table ship_tab" db2 "terminate" Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group DAD名を指定する方法-DADファイル neworder2.dad ファイルの内容(Windows版:抜粋) <?xml version="1.0"?> <!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd"> <DAD> <dtdid>neworder2.dtd</dtdid> <validation>NO</validation> <Xcollection> <prolog>?xml version="1.0"?</prolog> <doctype>!DOCTYPE Order SYSTEM "c:\dxx\samples\dtd\neworder2.dtd"</doctype> <root_node> <element_node name="Order"> <RDB_node> <table name="order_tab" key="order_key1 order_key2 order_key3"/> <table name="part_tab" key="part_key1 part_key2"/> <table name="ship_tab" key="date"/> <condition>order_tab.order_key1=part_tab.o_key1 AND order_tab.order_key2=part_tab.o_key2 AND order_tab.order_key3=part_tab.o_key3 AND part_tab.part_key1=ship_tab.p_key1 AND part_tab.part_key2=ship_tab.p_key2</condition> </RDB_node> <attribute_node name="Key1"> <RDB_node> <table name="order_tab"/> <column name="order_key1" type="integer"/> </RDB_node> </attribute_node> <attribute_node name="Key3"> <RDB_node> <table name="order_tab"/> <column name="order_key3" type="integer"/> </RDB_node> </attribute_node> Data Management Software 分解する表の定義 Key1属性のマッピング定義 Key3属性のマッピング定義 Systems Solution & Web Server Competence Center No.1 & No.4 DM Group DAD名を指定する方法-実行結果 shredxml.cmdの実行結果より、元となるXML文書が分解されてリレーショナル表に格納されたことを見ることができます。 db2 "select * from order_tab" ORDER_KEY CUSTOMER_NAME CUSTOMER_EMAIL ----------- ----------------- ---------------1 American Motors [email protected] db2 "select * from part_tab" COLOR PART_KEY PRICE ------- ----------- --------red 68 34850.16 red 128 38000.00 TAX QTY O_KEY -------------- --------- ----------+6.00000E-002 36 1 +7.00000E-002 28 1 db2 "select * from ship_tab" DATE ---------1998-08-19 1998-08-20 1998-12-30 MODE -----BOAT AIR TRUCK COMMENT P_KEY1 P_KEY2 ----------------------------------------------------------- ----------- ---------68 8 68 8 128 88888888 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group 分解したXMLデータの更新 XMLエクステンダー でXMLデータを分解して表に格納した後、そのデータの一部を更新することを考えます。 XMLエクステンダー のストアド・プロシージャでは、一度分解したデータを更新する機能を提供していません。 分解後のデータはDB2の表の形式で保管されているので、SQL文を使用して更新操作をすることになります。 あるいは、更新したいXMLデータに該当するデータをSQL文を使用して表からすべて削除し、新たに表にデータを 挿入(つまり、XMLエクステンダー のストアド・プロシージャによる分解)を行うことで対処することも可能です。 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group 最後に 今回はXMLコレクションを用いて、XML文書を分解した上で各データ要素をリレーショナル表に保管する方法を見てきま した。この方法ですと、XML文書の内容を他のアプリケーションでも利用したいときに、データを扱いやすいという利点 があります。 次回は、データ要素に分解して保管されたXMLコレクションから、再度、XML文書を合成する方法について、見ていきた いと思います。 Data Management Software Systems Solution & Web Server Competence Center No.1 & No.4 DM Group