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が使えるように,スクリーンショットで赤丸を付けたチェックボックスにチェックを入れる.

Image:DB2V9_XML_codeset.jpg

あとは適当に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()

XMLの値で行を選択 (SELECT) する方法

XMLの値を射影 (PROJECT) する方法

リンク集