概要
DB2 コマンドでエクスポートやインポートを行う際、CSVファイルをファイル名で指定する必要があり、パイプで受け渡すことができません。このため直接圧縮されたファイルを利用するためには一工夫が必要です。
具体的には FIFO を使うことで直接圧縮されたCSVファイルの読み書きを行うことができます。
記述
EXPORT
mkfifo fifo
ksh -c "gzip < fifo > [圧縮して出力するCSVファイル名]" &
db2 "export to fifo of del select * from hoge"
rm fifo
IMPORT
mkfifo fifo
ksh -c "gunzip < [圧縮された入力するCSVファイル名] > fifo" &
db2 "import from fifo of del insert into hoge"
rm fifo
TIPS
データベースのコードページをIBM943で作成しており、UTF-8のCSVをインポートする場合、VARCHARやCHARに2バイト文字を含んでいると、以下のようにCODEPAGEを指定して取り込もうとすると、UTF-8は漢字や半角カタカナなどが3バイトで表現されるため、文字列の後半が欠落してしまいます。
だめな例
db2 "import from [UTF-8なCSVファイル名] of del modified by codepage=1208 insert into hoge"
これを事前にエンコーディング変換してFIFO経由する方法で回避できます。
FIFOを利用した例
mkfifo fifo
ksh -c "iconv -f UTF8 -t IBM943 < [UTF-8なCSVファイル名] > fifo" &
db2 "import from fifo of del modified by codepage=943 insert into hoge"
rm fifo
UTF-8のCSVを圧縮したものをIBM943なDBに取り込みたいならこんな感じ。
mkfifo fifo
ksh -c "gunzip < [UTF-8な圧縮したCSVファイル名] | iconv -f UTF8 -t IBM943 > fifo" &
db2 "import from fifo of del modified by codepage=943 insert into hoge"
rm fifo