IBM DB2からEXPORTしたファイルを、MySQL形式のCSVファイルに変換するshell

csvは共通フォーマット！！IBM DB2であれば、EXPORT ユティリティで出力できるし、MySQLであれば .... INTO OUUTFILE でCSVを出力できます。CSVは共通フォーマットなので、例えば、DB2からMySQLにCSVファイルをそのまま移行できると思いきや・・・実はそんなに簡単にうまくいかないのです。

大きな部分では、改行コードがそれにあたります

DB2にしてみれば、改行コードは改行コードなのでCSVファイルも、テキストエディタで見ると改行がはいる形で見れます
かたやMySQLは、
改行コードをエスケープした形では入ります。\N とかそんなかんじですね。

なので、そのあたりを注意しつつ、DB2側のEXPORTを行うことになるのですが、数百あるテーブルをいちいち加工してEXPORTするのは面倒だ！ということで、

とにかく、DB2上に入っているテーブルすべてを、MySQL形式のCSVファイルでEXPORTしちゃうぜ！！というshellを作ってみました。

厳密にいいますと、MySQL用のCSV形式でEXPORTする、SQLを生成するshellですかねｗ

## shell

### 形式
こんな漢字で呼びます。注意する点は、[CSV出力パス]はディレクトリまで指定です。ファイル名は、スキーマ名と、テーブル名で自動生成されますって感じです

```
./db2_to_mysql_export2.sh -d [データベース名] -s [スキーマ名] -t [テーブル名] -c [CSV出力パス]
```
### 呼び出し例
```
./db2_to_mysql_export2.sh -d db2database -s SCHEMA1 -t AA  -c /tmp
```
## bash ソース
コピペして使ってくださいませ

### db2_to_mysql_export2.sh
```
#!/bin/bash

# DB2プロファイルのロード
. /home/db2inst1/sqllib/db2profile

while getopts "d:s:t:c:" opts
do
  case $opts in
    d) _dbname=$OPTARG ;;
    s) _tabschema=$OPTARG ;;
    t) _tabname=$OPTARG ;;
    c) _csv_data_path=$OPTARG ;;
  esac
done

if [ "$_dbname" == "" ]; then
  echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
  exit -1
fi

if [ "$_tabschema" == "" ]; then
  echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
  exit -1
fi

if [ "$_tabname" == "" ]; then
  echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
  exit -1
fi

if [ "$_csv_data_path" == "" ]; then
  echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
  exit -1
fi

# DB2のアカウント情報 #############
_dbuserid=db2inst1
_dbpasswd=dbpassword

# テンポラリファイル
_export_sql_create_path="/tmp"
_export_sql_path="/tmp"

cat << _EOT_ > ${_export_sql_create_path}/${_tabschema}.${_tabname}.export.sql.create.sql

CONNECT to ${_dbname} USER ${_dbuserid} USING ${_dbpasswd} ;

EXPORT TO ${_export_sql_path}/${_tabschema}.${_tabname}.export.sql OF DEL 
MODIFIED BY NOCHARDEL
SELECT
  ZZZ.STRSQL
FROM
(
SELECT 
  TEMP.*
FROM
(
VALUES
  (0,'CONNECT TO ${_dbname} user ${_dbuserid} using ${_dbpasswd} ;'),
  (1,'EXPORT TO ${_csv_data_path}/${_tabschema}.${_tabname}.csv OF DEL MODIFIED BY codepage=1208 SELECT ')
) AS TEMP(SEQNO,STRSQL)
UNION ALL 
SELECT
  Z.SEQNO,
  RTRIM(Z.STRCOL) AS STRSQL
FROM
(
SELECT
  X.COLNO + 100 AS SEQNO,  
  CASE
    WHEN X.NULLS='Y' AND X.TYPENAME <> 'VARCHAR' 
    THEN 
      X.COLNAME WHEN X.NULLS='Y' AND X.TYPENAME = 'VARCHAR' THEN 'COALESCE(' || X.COLNAME || ', ''\N'')'   
    ELSE 
      X.COLNAME   
    END ||
  CASE
    WHEN Y.MAX_COLNO=X.COLNO
    THEN 
      ' FROM ${_tabschema}.${_tabname} ; '
    ELSE
      ' ,'
    END AS STRCOL
 FROM 
  (
  SELECT
    TABSCHEMA,
    TABNAME,
    COLNO,
    COLNAME,
    TYPENAME,
    NULLS
  FROM
    SYSCAT.COLUMNS   
   WHERE 
     TABSCHEMA = '${_tabschema}'  AND 
     TABNAME = '${_tabname}'  
  ) X ,
  (
  SELECT
    TABSCHEMA,
    TABNAME,
    MAX(COLNO) AS MAX_COLNO
  FROM
    SYSCAT.COLUMNS   
  WHERE 
    TABSCHEMA = '${_tabschema}'  AND 
    TABNAME = '${_tabname}'  
  GROUP BY
    TABSCHEMA,
    TABNAME     
  ) Y 
    ORDER BY X.COLNO 
) Z
) ZZZ
ORDER BY
  ZZZ.SEQNO  
;

_EOT_

db2 -tvf ${_export_sql_create_path}/${_tabschema}.${_tabname}.export.sql.create.sql
db2 -tvf ${_export_sql_path}/${_tabschema}.${_tabname}.export.sql

cat << _EOT_ 
CSV出力が完了しました。CSVファイルは、
${_csv_data_path}/${_tabschema}.${_tabname}.csv
に保存されております
_EOT_

exit 0
```

## CSV出力結果

```
$ cat /tmp/SCHEMA1.AA.csv                                                                                                          
893,11,"GGG"
894,11,"HHH"
888,12,"テスト"
1,1,"aaa'"
2,0,"test2"
3,1,"foo\"
4,1,"\N"
5,1,"NULL"
6,1,"\\n"
7,1,"""DBL"""
100,0,"test"
101,0,"testtest"
102,0,"日本語テスト"
```