DB2 pureXML
出典: Fukudat
DB2 V9 pureXML での XQuery の使い方を説明する.Linux への DB2 V9のインストール方法はDB2 V9 on FC6を参照してほしい.
pureXMLの特徴は,
- RDBのカラムの型としてXML型のデータを取り扱うことができる
- XML型のデータに対して,XML用の問合せ言語XQueryを用いることができる
- RDB用の問合せ言語SQLの中で,XML型のデータを使うことができる.
と言ったところ.
TO-DO:
- XQuery のサンプルをまともなものにする.
- SQLからXQueryを呼び出す方法を記述する.
目次 |
XML用 Database の作成
pureXMLを使用するには,database 作成時に指定しなければならない.
DB2コントロールセンタ (db2cc) で,All Databasesを右クリックしてメニューを出し,Create Database->Standardを選択する.データベース作成ウィザードが開くので,データベースの名前を入力する画面でデータベースに名前を付けるのと同時にXMLが使えるように,スクリーンショットで赤丸を付けたチェックボックスにチェックを入れる.
あとは適当にNextを押して進んで完了.
XMLデータを含むテーブルの作成
やはりコントロールセンタ (db2cc) で,上で作成したXMLデータベースの下の Tables を右クリックしてメニューを出し、Create を選択.Create Table Wizard が開くので,テーブル名,カラム定義,インデックス,キーなどを入力していく.Data Partitioning,Data Clustering, Constraints は飛ばしてよい.
このカラム定義の際,データタイプに XML を選ぶとそのカラムにはXML文書が格納され,SQLとXQueryを組み合わせた問い合わせが可能になる.
以後の説明のため,一つ具体例を作っておこう.テーブル名は "XMLTEST".カラム定義は以下の通り.
- id BIGINT型 (value generation で identity を選んで連番を生成) primary key
- lastmodified TIMESTAMP型
- document XML型
レコードの挿入
XML型は文字列だと思えば普通のSQLと同じように扱える.例えば,
insert into XMLTEST(lastmodified, document) values
('2007-06-25 01:23:45.6789', '<?xml version="1.0"?><root>Hello, World!</root>')
とすれば1行挿入される.
DB2コマンドセンタ(コントロールセンタから起動できる)から入力・実行できるので試してほしい.
XQueryによる問合せ
問い合わせの先頭に xquery と記述すると,それ以降に XQuery が記述できる. 例えば,
xquery <root>Hello, World!</root>
は,(データベースをまったく参照しない)XQueryの例である. XQueryによる問い合わせは,一般のSQLの問い合わせと同様に,コマンドセンタで実行できる。
XML型カラムの参照
データベースのXML型のカラムを参照するXQueryは db2-fn:xmlcolumn() 関数を用いて記述する.
xquery
for $x in db2-fn:xmlcolumn('XMLTEST.DOCUMENT')/root
return $x
は XMLTEST テーブルの DOCUMENT カラム(XML型) のルートエレメント root をすべて列挙する問い合わせとなる.
テーブル名(ここではXMLTEST),カラム名(同DOCUMENT)は 大文字で表記しなければならないことに注意してほしい.'xmltest.document' などとすると,エラーとなる.
この関数さえ使えば,XMLカラムの内容をXQueryで自由に処理することが可能だ.
XQueryからSQLを利用する
せっかくXML以外のカラムがあるのだから、それを活用した問い合わせを記述したい. そのためにあるのが db2-fn:sqlquery() 関数である.
xquery
for $x in db2-fn:sqlquery('select document from xmltest where lastmodified < '2007-04-01')/root
return $x
この問い合わせではdb2-fn:sqlquery()の引数に埋め込んだSQL文でXML型のカラム以外のカラムを用いた条件(この場合はlastmodifiedカラム)でXQueryの処理対象となるXMLデータを限定している.XMLカラム内のデータにlastmodifiedに相当するデータを持つことでXQueryだけで同等の問い合わせを行うことが可能だが,SQLを利用することによりずっと効率がよくなる.
なおSQLでは大文字・小文字の区別はないので,埋め込んだSQL文内では,xmltest, document などと記述してもよい.
SQL/XMLによる問合せ
XML型カラムのあるテーブルも通常のリレーショナルテーブルなので,SQLを用いて問合せができるのは当然である. しかし,XML型カラムの内容をSQL文から参照するにはどうしたらよいのだろう. このために次のような関数が用意されている.
- xmlexists()
- xmlquery()
- xmltable()
- xmlelement()

