Oracle SQL ローダで、データを複数の列にストアする技(SQL関数を制御ファイルで使用) [SE]
現在のプロジェクトで、
4月からサービスインしたシステムの仕様変更を担当してます。
で、
今やっているのは
マスタ更新バッチの仕様追加。
他システムから送られてくるマスタデータを当システムのマスタDBに放り込むもので、
機能追加に伴うマスタテーブル列追加の対応です。
で、
マスタデータの一部を複数の列に設定しなければならなくなったのですが、
DBへのロードはSQLローダが使われてまして。
複数の列に同じデータを放り込むみたいな器用なことが
SQLローダでできるのかしら?
と思いながらググってたら。
SQLのデータ操作と同じことが出来るのがわかりました。
【今回のテクニック】
固定長データの一部を複数の列に放り込むのですが、次のように制御文を書きます。
LOAD DATA
INTO TABLE TBL_FOO
(
HOGE_ID CHAR( 8) POSITION( 1: 8),
HOGE_NAME CHAR(60) POSITION( 9: 68),
OTHER_ID CHAR( 2) POSITION( 69: 70),
DEL_FLAG CHAR(1) CONSTANT '0',
FOO_ID CHAR RPAD(:HOGE_ID, 8)||RPAD(:OTHER_ID, 2) --ここがミソ!!
)
ミソの部分を説明すると、
HOGE_ID 列と OTHER_ID 列に入る値を
それぞれ8桁と2桁まで空白埋めして
文字列連結して
FOO_ID 列にセットしなさい、
という構文です。
流石だぜ、と一瞬感心したのですが、
制御ファイルの内容に従い動的SQLを組み立てているのだし、
SQL関数を使えるとか
データ操作とかできるようにするとか
というのは
当然の発想ですよね。
今まで知らずにいた‘凡庸’がアホでした。。。
なお、
上記のような便利なワザを知らず
わざわざ java バッチでデータロードプログラムとか作っていたのは
お客様には内緒です。
(過去の話ですが。。。)






