日々常々

ふつうのプログラマがあたりまえにしたいこと。

テーブルのデータをCSV出力する(SQLを作るSQL)

これは試行錯誤の途中経過です。まとめ→http://d.hatena.ne.jp/irof/20100108/p2

      • -

PL/SQLは嫌だとか、古いバージョンで使えないとか、ネットワークから隔離されているとかの逃げ道に、SQLを作るSQLを発行して、作ったSQLを発行する手があります。1テーブルだけの場合は、WHEREを追加してください。

SELECT
  DECODE(COLUMN_ID, '1', 'SELECT ') "SELECT",
  COLUMN_NAME "COLUMN",
  DECODE(
    COLUMN_ID,
    (MAX(COLUMN_ID) OVER(PARTITION BY TABLE_NAME)),
    ' FROM ' || TABLE_NAME || ';',
    ' || '','' || ') "TABLE"
FROM USER_TAB_COLUMNS
ORDER BY TABLE_NAME, COLUMN_ID;

このSQLを実行すると、こんな感じでテーブルの全列を「,」で繋げるSQLが出来ます。

SELECT         COLUMN           TABLE
-------------- ---------------- ----------------
SELECT         COLUMN1          || ',' ||
               COLUMN2          || ',' ||
               COLUMN3          || ',' ||
               COLUMN4          || ',' ||
               COLUMN5          FROM TABLE1;
SELECT         COLUMN1          || ',' ||
               COLUMN2          || ',' ||
               COLUMN3          FROM TABLE2;
SELECT         COLUMN1          || ',' ||
               COLUMN2          || ',' ||
               COLUMN3          || ',' ||
               COLUMN4          FROM TABLE3;

後は作ったSQLを発行すればCSV形式の検索結果が得られます。手っ取り早さや制限の少なさでではこちらが優勢、ただしテーブル数が多くなるとちょっと面倒な作業が増えます。環境とか対象テーブル数とか諸々の条件次第でやり方は選択すると良いです。

と思ったけど、面倒な作業の部分はクリアできました。逃げ道のつもりが本命に化けてしまった感じ。