Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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ですかねw

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,"日本語テスト"
hit
なんとなくデータベースエンジニア。なんとなくメモしてます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away