DB2 9.5 で XML列を通常列にしてCURSOR LOAD

ややや、久しぶりに日記を更新・・
内容は日記じゃないけどぉ


通常データをLOADする場合は、DEL形式やIXF形式のEXPORTデータが
必要なのですが、CURSOR LOADは現在運用しているテーブルを
ロード元(EXPORTデータ)として指定できるのです。


たとえばtable_aからtable_bに丸々(またはwhere句で条件を指定)コピりたい場合

カーソル定義をつくり

DECLARE cursor_table_a CURSOR FOR select * from table_a

おもむろにロード

LOAD FROM cursor_table_a OF CURSOR REPLACE INTO table_b

で、EXPORTしたファイルは必要ありません。

さて、DB2 9はXMLが使えるようになるのですが
XMLは通常の人には少々扱い難いし、datawarehouse系で集計・分析を
したりには残念ながらまだDB2の周辺ツールは対応が仕切れていないのが現状・・
だからといって今までどおりにRDB列に戻るのも時代錯誤なきもする。

だったら、XMLで格納したデータをDWH向けにRDB列に変換してあげれば
いいんじゃないかなと思うしだいです。

そこでXMLTABLE関数を利用します。
XMLTABLE関数はXML列の項目をRDB列に変換してくれる頼もしい関数で
これがあったからこそDB2 9でXMLをさくっと使うことができた
自分にとっては重要な関数です。

たとえば,
XML列にtesttableというテーブルにxmldataというXML型の列があるとして
以下のようなデータが入っていたとします。


12345

aaaa
100*200
1200


この中のを取り出したい場合
以下のようなQueryを書く次第。

select x.name,x.price from testtable tt,
xmltable('$i/item/datas'
passing d.item as "i" columns
name varchar(200) path './name',
price int path './price'
) as x


こうすることでXMLとして扱うところがRDB列として普段どおりに
扱えるようになるのです。

これをCURSOR LOADに応用して、

DECLARE cursor_testtable CURSOR FOR
select x.name,x.price from testtable tt,
xmltable('$i/item/datas'
passing d.item as "i" columns
name varchar(200) path './name',
price int path './price'
) as x


とするだけで、後は同じ。

LOAD FROM cursor_testtable OF CURSOR REPLACE INTO testtable_b


まあ、わざわざLOADかけるのも・・って話もあるでしょうけど
別テーブルに集計しておけば本運用テーブルにガリガリQueryも
流れなくてよかったりしますしね。

本当はMQTが使えればいいのですが、それはDB2の時期バージョンに
期待ってことで・・・