Oracle PL/SQLブロックでデータをCSV出力する
おはようございます。
今日も昨日に引き続き Oracle のツールです。
今回は指定したテーブルの内容をCSVに出力するバッチを作りました。
スポンサーリンク
CSV出力する
昨日と同じように、PL/SQLブロックを活用して
取得したデータをCSV形式に編集してスプールログに出力するといったものになります。
実行するSQL
OUTPUT_CSV.SQL
SPOOL &1 SET SERVEROUTPUT ON SIZE 1000000 SET LINESIZE 1000 SET ECHO ON SET PAGESIZE 9999 SET colsep ',' DECLARE STRCOLUMN VARCHAR(32767); STRCOLUMNNAME VARCHAR(32767); TYPE CUTYPE IS REF CURSOR; CV CUTYPE; ITEM VARCHAR(1000); BEGIN STRCOLUMN := ''; FOR CUR_REC IN ( SELECT C.COLUMN_NAME FROM USER_TAB_COLUMNS C , USER_TABLES T WHERE C.TABLE_NAME = T.TABLE_NAME AND T.TABLE_NAME = '&2') LOOP BEGIN IF STRCOLUMN IS NULL THEN 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; END IF; END; END LOOP; DBMS_OUTPUT.PUT_LINE('---------------------------------------- 結果 ----------------------------------------'); DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE(STRCOLUMNNAME); BEGIN OPEN CV FOR 'SELECT ' || STRCOLUMN || ' AS STR FROM ' || '&2'; LOOP FETCH CV INTO ITEM; EXIT WHEN CV%NOTFOUND; BEGIN DBMS_OUTPUT.PUT_LINE(ITEM); END; END LOOP; CLOSE CV; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END; END; / SPOOL OFF EXIT 0
SQL呼び出しバッチ
OUTPUT.bat
@echo off REM 実行するSQLファイル SET SQLFILE=OUTPUT_CSV.SQL REM ログファイル(スプール) SET LOGFILE=OUTPUT_CSV.LOG REM 対象ユーザー SET TARGET=USER01 REM パスワード SET PASS=USER01 REM TNSサービス名 SET SERVICE_NAME=ORCL REM テーブル名 SET TABLE_NAME=TBLCAT REM 実行 sqlplus %TARGET%/%PASS%@%SERVICE_NAME% @%SQLFILE% "%LOGFILE%" "%TABLE_NAME%" pause
起動してみる
今回は、データの出力のみなので、
以前作成したサンプルプログラム用のテーブルからデータをCSV出力してみました。
無事に出力されました。
ただ、スプールの仕様で、各行の後ろに空白データが大分ついてしまっているので、エディタなんかで最終的に編集する必要があります。
追記
@ken_tokuda さんに Twitter で、
下記の設定で後ろの空白を消せるというのを教えていただきました。
set trimspool on
まとめ
場合によっては便利なクライアント用ソフトが使えない場合もあるので、
こういったツールが活躍する場面もあるかと思います。
また、客先のシステムなんかで、リモートで調査が出来ない場合なんかに
データを取得してもらうのにバッチの形式は便利ですよね。
昨日、今日とサクッとした記事になりましたが、
何かのお役に立てれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません