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 |
まとめ
場合によっては便利なクライアント用ソフトが使えない場合もあるので、
こういったツールが活躍する場面もあるかと思います。
また、客先のシステムなんかで、リモートで調査が出来ない場合なんかに
データを取得してもらうのにバッチの形式は便利ですよね。
昨日、今日とサクッとした記事になりましたが、
何かのお役に立てれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません