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系の操作をしないのであれば,なかなか便利です.