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の時期バージョンに
期待ってことで・・・