DB2 9 と XQuery

1ヶ月弱前になりますが,DB2 9 を使用する機会がありました.
DB2 9 では,XMLが正式にサポートされています.RDB上の任意のcolumnに対し,"xml" データ型を指定することで,XMLをツリー構造のまま保管できるようになります.
また,XQueryを使用することで,出力結果をXMLとして取得できたり,出力結果を更に加工した結果を XML として取得することもできます.

DB2 9 Express-C for Windows クイックインストール
http://www-06.ibm.com/jp/developerworks/db2express/installwin_v9.shtml


(1) 名前でソートして,上から3つを取得する場合
データは,SAMPLEデータベースのCUSTOMERテーブルを使います.

xquery
declare default element namespace "http://posample.org";
let $ns := <t>{
  for $n in db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo/name
    order by $n/text()
    return $n
}</t>
return <names>{$ns//name[position() lt 4]}</names>#
  • position()は,1から始まるindexを返す
  • "<t>{...}</t>"は,一時的にオーダリング結果をバインドするための仮要素
  • "return $n"のところで,いろいろと加工することができる


(2) 複数の名前空間を使う場合は,プロローグにきちんと宣言する
たとえば,以下の2つの名前空間があるとしましょう.

http://hoge.com/projectx/a
http://hoge.com/projectx/b

これらを名前空間として持つスキーマを使用する場合,

xquery
declare namespace a="http://hoge.com/projectx/a";
declare namespace b="http://hoge.com/projectx/b";
for $b in db2-fn:xmlcolumn("どこかのカラム")//b:item
let $as := db2-fn:xmlcolumn("どこかのカラム")//a:item[text() eq $b/text()]
...

のようにしなければなりません.
namespace prefix(上記コードでいう "a:" とか "b:" とか)を省略すると,正しくXPathが解決されなくなります.
これって,わかっていても,案外指定し忘れてることが多いんですよ〜.(^_^;


ほかにもいろいろできます.InsertやUpdate系の操作をしないのであれば,なかなか便利です.