LoginSignup
3
2

More than 5 years have passed since last update.

db2のシステムテーブルを利用してMySQL用のcsvファイルを作成するSQLを生成する

Last updated at Posted at 2014-08-06

どう説明したら良いのか・・。

表題の件、何を言っているのかわからないと思いますが、また同じ説明をするかもしれませんが、db2のシステムテーブル(syscat.columns)を利用して、MySQLに合わせた、csv形式に変換をかける、「db2のエクスポートSQL」を生成するSQLですw

EXPORT TO .\exportsql\_tabschema_._tabname_.sql OF DEL 
MODIFIED BY NOCHARDEL
VALUES
  ('EXPORT TO .\csv\_tabschema_._tabname_.csv OF DEL MODIFIED BY codepage=1208 SELECT ')
UNION ALL 
SELECT
  RTRIM(Z.STRCOL) AS S_COLUMNS
FROM
(
SELECT   
  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 
;

・・・で結果はどうなるのか?

こんなかんじになったりします。

EXPORT TO .\csv\SCHEMA.AA.csv OF DEL MODIFIED BY codepage=1208 SELECT 
SEQ_ID ,
COLAAAAA ,
COALESCE(GENRE, '\N') FROM SCHEMA.AA ;
  • syscat.columns から、カラム名を、設定された順番どおりに取得する。
  • DB2上のNULLはNULLなのですが、MySQL上のNULLは、\n なのでそれに変換する
  • CSVの文字コードを強制的に、utf-8(1208)に変換する

とまあ、これだけの話です。。。
DB2のデータを、MySQLに移行するときに大活躍しました。

・・で生成したSQLをさらに流すと、MySQL用のCSVファイルが完成する!

こんなデータになるわけです

893,11,"GGG"
894,11,"HHH"
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,"日本語テスト"
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2