XML エクステンダーには、データベース内の XML 文書全体の保管とアクセスのための方式が備わっています。 それは XML 列と呼ばれます。 XML 列方式を使用すると、XML ファイル・タイプを使用して文書を保管し、 サイド表内の列に索引付けし、その後で XML 文書を照会または検索することができます。 この保管方式は、文書が頻繁に更新されないアーカイブ・アプリケーションで特に役立ちます。 このチュートリアルの目的上、用意されている XML 文書を XML 列に保管します。
この演習では、文書を SALES_TAB 表に保管します。 文書を保管するには、以下のように行います。
DTD を使用して XML 列内の XML データを妥当性検査できます。 XML 対応のデータベース (DTD_REF) 内に表が作成されます。 この表は DTD 参照と呼ばれ、DTD を保管するのに使用することができます。 XML 文書を妥当性検査することにした場合、DTD をこのリポジトリーに保管しなければなりません。 このチュートリアルの DTD は c:\dxx\samples\dtd\getstart.dtdです。
DTD を挿入するには、以下のように行います。
DB2 コマンド・ウィンドウから、以下の SQL INSERT コマンドを入力します。
DB2 CONNECT TO SALES_DB DB2 INSERT into db2xml.dtd_ref values('c:\dxx\samples\dtd\getstart.dtd', db2xml.XMLClobFromFile('c:\dxx\samples\dtd\getstart.dtd'), 0, 'user1', 'user1', 'user1')
また、次のようなコマンド・ファイルを実行して DTD を挿入することもできます。
getstart_insertDTD.cmd
XML 列の DAD ファイルは、単純な構造になっています。 保管モードが XML 列であることを指定して、索引付けのための表および列を定義します。
以下のステップで、DAD 内の要素はタグと呼ばれ、 XML 文書構造の要素は要素と呼ばれます。 作成する DAD ファイルに類似したサンプルは、 c:\dxx\samples\dad\getstart_xcolumn.dadにあります。 このサンプルは、以下のステップで生成するファイルとは若干異なります。 それを学習で使用する場合、ファイル・パスがご使用の環境のものと異なる可能性があることと、 <validation> 値が YES ではなく NO に設定されていることに注意してください。
DAD ファイルを準備するには、以下のように行います。
DAD ファイル内で使うどのタグでも、大文字小文字の区別があることに注意してください。
<?xml version="1.0"?> <!DOCTYPE DAD SYSTEM "c:\dxx\dtd\dad.dtd">DAD ファイルは XML 文書であり、XML 宣言を必要とします。
<dtdid>c:\dxx\samples\dtd\getstart.dtd</dtdid>
このストリングが、DTD リポジトリーへの DTD の保管の中の DTD 参照表への DTD の挿入時の 最初のパラメーター値として使った値に一致することを確認します。 たとえば、別のマシン・ドライブで作業していれば、 DTDID に使用するパスは上記のストリングとは異なることがあります。
<validation>YES</validation><validation> の値は英大文字で指定しなければなりません。
<Xcolumn> </Xcolumn>
<Xcolumn> <table name="order_side_tab"> </table> <table name="part_side_tab"> </table> <table name="ship_side_tab"> </table> </Xcolumn>
<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>
作成したばかりのファイルを、サンプル・ファイル c:\dxx\samples\dad\getstart_xcolumn.dad と比較することができます。 このファイルは、XML 列を使用可能にしてサイド表を作成するのに必要な DAD ファイルの作業用コピーです。 このサンプル・ファイルには、 個々の環境に合わせて変更しないと実行しても正常に完了しない可能性のあるパス・ステートメントが入っています。
この節では、SALES_TAB 表を作成します。 そこには初期状態で、注文についての販売情報を含む 2 つの列があります。
表を作成するには、以下のように行います。
DB2 コマンド・ウィンドウで、 以下の CREATE TABLE ステートメントを入力します。
DB2 CONNECT TO SALES_DB DB2 CREATE TABLE SALES_TAB(INVOICE_NUM CHAR(6) NOT NULL PRIMARY KEY, SALES_PERSON VARCHAR(20))
あるいは、次のようなコマンド・ファイルを実行して表を作成することもできます。
getstart_createTabCol.cmd
ここで、新規の列を SALES_TAB 表に追加します。 この列には以前に生成した原形の XML 文書が含まれることになり、 それは XML UDT のものでなければなりません。 XML エクステンダーには、XML エクステンダーのユーザー定義タイプに説明されている複数のデータ・タイプが備わっています。 このチュートリアルでは、文書を XMLVARCHAR として保管します。
XML タイプの列を追加するには、以下のように行います。
DB2 コマンド・ウィンドウで、以下の SQL ステートメントを入力します。
DB2 ALTER TABLE SALES_TAB ADD ORDER DB2XML.XMLVARCHAR
あるいは、次のようなコマンド・ファイルを実行して表を更新することもできます。
getstart_alterTabCol.cmd
XML タイプの列を作成した後、それを XML エクステンダーに関して使用可能にします。 列を使用可能にすると、XML エクステンダーは DAD ファイルを読み込んで、サイド表を作成します。 列を使用可能にする前に、以下のことを行う必要があります。
列を XML に関して使用可能にするには、以下のように行います。
DB2 コマンド・ウィンドウで、以下のコマンドを入力します。
dxxadm enable_column SALES_DB SALES_TAB ORDER GETSTART_XCOLUMN.DAD -v SALES_ORDER_VIEW -r INVOICE_NUM
あるいは、次のようなコマンド・ファイルを実行して XML の列を使用可能にすることもできます。
getstart_enableCol.cmd
XML エクステンダーは、INVOICE_NUM 列の入ったサイド表を作成し、デフォルト視点を作成します。
重要: サイド表は決して変更しないでください。 XML エクステンダーに付属している UDF を使って XML 文書の更新だけを行うようにしてください。 XML 列内の XML 文書を更新すると、サイド表は自動的に更新されます。
XML 列を使用可能にしたとき、XML 列およびサイド表のビューが作成されています。 このビューを使用して、XML 列を扱うことができます。
XML 列およびサイド表の列を表示するには、以下のように行います。
DB2 コマンド・ウィンドウで、以下の SQL SELECT ステートメントを入力します。
DB2 SELECT * FROM SALES_ORDER_VIEW
この視点は、getstart_xcolumn.dad ファイルに指定されているとおり、サイド表内の列を示します。
サイド表で索引を作成すると、XML 文書の構造の高速検索が可能になります。
このステップでは、
XML 列 ORDER を使用可能にしたときに作成されたサイド表内のキー列に索引を作成します。
社員がどの列を最も頻繁に照会するかは、サービス部門から知らされています。
表 3 はそのような列を示しています。これらに索引を付けます。
列 | サイド表 |
---|---|
ORDER_KEY | ORDER_SIDE_TAB |
CUSTOMER | ORDER_SIDE_TAB |
PRICE | PART_SIDE_TAB |
DATE | SHIP_SIDE_TAB |
サイド表に索引を付けるには、次のようにします。
DB2 コマンド・ウィンドウで次のような SQL コマンドを入力します。
DB2 CREATE INDEX KEY_IDX ON ORDER_SIDE_TAB(ORDER_KEY) DB2 CREATE INDEX CUSTOMER_IDX ON ORDER_SIDE_TAB(CUSTOMER) DB2 CREATE INDEX PRICE_IDX ON PART_SIDE_TAB(PRICE) DB2 CREATE INDEX DATE_IDX ON SHIP_SIDE_TAB(DATE)
あるいは、次のようなコマンド・ファイルを実行して索引を作成することもできます。
getstart_createIndex.cmd
XML 文書を入れる列を使用可能にし、サイド表に索引を付け終わったので、 XML エクステンダーに備わっている関数を使用して文書を保管できるようになりました。 データを XML 列に保管するとき、 デフォルト・キャスト関数または XML エクステンダー UDF のどちらかを使用します。 基本タイプ VARCHAR のオブジェクトを XML UDT XMLVARCHAR の列に保管することになるので、 デフォルト・キャスト関数を使用します。 保管のデフォルト・キャスト関数および XML エクステンダーに備わっている UDF についての詳細は、 データを保管するを参照してください。
XML 文書を保管するには、以下のように行います。
重要: XML 文書 c:\dxx\samples\xml\getstart.xml を開きます。 DOCTYPE にあるファイル・パスが、 DTD リポジトリーに DTD を挿入するときに DAD に指定する DTD ID と一致するかどうかを確認してください。 この確認は、 db2xml.DTD_REF 表を照会し、 DAD ファイルの DTDID 要素を調べることによって行えます。 デフォルトとは異なるドライブおよびディレクトリー構造を使用している場合、 DOCTYPE 宣言のパスを変更する必要があります。
DB2 コマンド・ウィンドウで、以下の SQL INSERT コマンドを入力します。
DB2 INSERT INTO SALES_TAB (INVOICE_NUM, SALES_PERSON, ORDER) VALUES('123456', 'Sriram Srinivasan', db2xml.XMLVarcharFromFile('c:\dxx\samples\cmd\getstart.xml'))
XML 文書を保管するとき、XML エクステンダーは自動的にサイド表を更新します。
あるいは、次のようなコマンド・ファイルを実行して文書を保管することもできます。
getstart_insertXML.cmd
表が更新されたことを確認するには、 DB2 コマンド・ウィンドウでその表に対して以下の SELECT ステートメントを実行します。
DB2 SELECT * FROM SALES_TAB DB2 SELECT * FROM PART_SIDE_TAB DB2 SELECT * FROM ORDER_SIDE_TAB DB2 SELECT * FROM SHIP_SIDE_TAB
サイド表を直接照会することによって、XML 文書を検索できます。 このステップでは、価格が 2500.00 を超えるすべての注文を検索します。
サイド表を照会するには、以下のように行います。
DB2 コマンド・ウィンドウで次のような SELECT ステートメントを入力します。
DB2 "SELECT DISTINCT SALES_PERSON FROM SALES_TAB S, PART_SIDE_TAB P WHERE PRICE > 2500.00 AND S.INVOICE_NUM=P.INVOICE_NUM"
結果セットには、価格が 2500.00 を超える品目を販売した販売員の名前が示されているはずです。
あるいは、次のようなコマンド・ファイルを実行して文書を検索することもできます。
getstart_queryCol.cmd
以上で、XML 文書を DB2 表に保管する入門用のチュートリアルを完了しました。 本書に示す例の多くは、これらの学習課程に基づいています。