Oracle PL/SQLブロックでデータをCSV出力する
おはようございます。
今日も昨日に引き続き Oracle のツールです。
今回は指定したテーブルの内容をCSVに出力するバッチを作りました。
スポンサーリンク
CSV出力する
昨日と同じように、PL/SQLブロックを活用して
取得したデータをCSV形式に編集してスプールログに出力するといったものになります。
実行するSQL
OUTPUT_CSV.SQL
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | SPOOL&1 SETSERVEROUTPUTONSIZE1000000 SETLINESIZE1000 SETECHOON SETPAGESIZE9999 SETcolsep',' DECLARE     STRCOLUMN      VARCHAR(32767);     STRCOLUMNNAME  VARCHAR(32767);     TYPECUTYPEISREFCURSOR;     CVCUTYPE;     ITEMVARCHAR(1000); BEGIN   STRCOLUMN:='';   FORCUR_RECIN(     SELECT         C.COLUMN_NAME     FROM         USER_TAB_COLUMNSC,         USER_TABLEST     WHERE             C.TABLE_NAME=T.TABLE_NAME         ANDT.TABLE_NAME='&2')   LOOP     BEGIN       IFSTRCOLUMNISNULLTHEN         STRCOLUMN:=STRCOLUMN||CUR_REC.COLUMN_NAME;         STRCOLUMNNAME:=STRCOLUMNNAME||CUR_REC.COLUMN_NAME;       ELSE         STRCOLUMN:=STRCOLUMN||' || '','' || '||CUR_REC.COLUMN_NAME;         STRCOLUMNNAME:=STRCOLUMNNAME||','||CUR_REC.COLUMN_NAME;       ENDIF;     END;   ENDLOOP;   DBMS_OUTPUT.PUT_LINE('---------------------------------------- 結果 ----------------------------------------');   DBMS_OUTPUT.PUT_LINE(' ');   DBMS_OUTPUT.PUT_LINE(STRCOLUMNNAME);   BEGIN     OPENCVFOR'SELECT '||STRCOLUMN||' AS STR FROM '||'&2';       LOOPFETCHCVINTOITEM;         EXITWHENCV%NOTFOUND;         BEGIN           DBMS_OUTPUT.PUT_LINE(ITEM);         END;       ENDLOOP;     CLOSECV;   EXCEPTION     WHENOTHERSTHEN       DBMS_OUTPUT.PUT_LINE(SQLERRM);   END; END; / SPOOLOFF EXIT0 | 
SQL呼び出しバッチ
OUTPUT.bat
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @echo off REM 実行するSQLファイル SETSQLFILE=OUTPUT_CSV.SQL REM ログファイル(スプール) SETLOGFILE=OUTPUT_CSV.LOG REM 対象ユーザー SETTARGET=USER01 REM パスワード SETPASS=USER01 REM TNSサービス名 SETSERVICE_NAME=ORCL REM テーブル名 SETTABLE_NAME=TBLCAT REM 実行 sqlplus%TARGET%/%PASS%@%SERVICE_NAME%@%SQLFILE%"%LOGFILE%""%TABLE_NAME%" pause | 
起動してみる
今回は、データの出力のみなので、
以前作成したサンプルプログラム用のテーブルからデータをCSV出力してみました。

無事に出力されました。
ただ、スプールの仕様で、各行の後ろに空白データが大分ついてしまっているので、エディタなんかで最終的に編集する必要があります。
追記
@ken_tokuda さんに Twitter で、
下記の設定で後ろの空白を消せるというのを教えていただきました。
| 1 | settrimspoolon | 
まとめ
場合によっては便利なクライアント用ソフトが使えない場合もあるので、
こういったツールが活躍する場面もあるかと思います。
また、客先のシステムなんかで、リモートで調査が出来ない場合なんかに
データを取得してもらうのにバッチの形式は便利ですよね。
昨日、今日とサクッとした記事になりましたが、
何かのお役に立てれば。
ではでは。










ディスカッション
コメント一覧
まだ、コメントがありません