・データの取得にSQLPlusの「SET MARKUP CSV」というSET句の機能を利用するため
それがサポートされているバージョン(おそらくOracleClient 12.2以上)が前提
・ポイント
「SET MARKUP CSV」は区切り文字設定(DELIMI~)できるが、TAB文字は普通には設定できないっぽいので下記のように設定している。(これを設定しなければデフォルトカンマ区切りでCSV出力)
title.rb
COLUMN TAB NEW_VALUE varTAB
SELECT CHR(9) AS TAB FROM DUAL;
SET MARK CSV ON DELIMI '&varTAB' QUOTE ON
・その他SET句などは下記のように設定したりしている。(取得するデータの内容によって設定は見直し)
title.rb
--データベースから一度にフェッチする配列の大きさ
SET ARRAYSIZE 512
--スクリプトのSQLPlusコマンドを表示しない
SET ECHO OFF
--問い合わせの結果レコード件数を表示しない
SET FEED OFF
--出力をユーザの表示デバイスに表示しない
SET FLU OFF
--実行するスクリプトのコマンドによって生成される出力を表示しない
SET TERM OFF
--SQL実行時間を表示しない
SET TIMI OFF
--置換変数に設定する前後の状態を表示しない
SET VERIFY OFF
--レコード・セパレータ設定(これをせていしないと結果に余計な改行が入ってしまう)
SET RECSEP OFF
--プロンプト画面に現在時刻を表示させる。
SET TIME ON
--NUMBER型の表示幅を指定(桁数が多いと指数表示になってしまうのでそれの回避用)
SET NUMWIDTH 15
--TAB区切り
COLUMN TAB NEW_VALUE varTAB
SELECT CHR(9) AS TAB FROM DUAL;
SET MARK CSV ON DELIMI '&varTAB' QUOTE ON
--日付型の表示形式設定
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS';
・その他のメモ
実例:下記のようなSQLをbatなどから実行して、実行した日のフォルダ、日時のファイルを出力するようにしている。
title.rb
--フォルダ名の日付部分取得
COLUMN DIR DATE NEW_VALUE varDIR_DATE
SELECT TO_CHAR(SYSDATE,'YYYYMMDD') AS DIR_DATE FROM DUAL;
--ファイル名の日付時刻部分取得
COLUMN LOG_DATE NEW_VALUE varLOG_DATE
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') AS LOG_DATE FROM DUAL;
--HostコマンドでOSのコマンドが実行できるようになる。
--WindowsコマンドのMdコマンドでフォルダを作成
host Md &varDIR_DATE.
--ログ出力
spool ./&varDIR_DATE./OutputTest_&varLOG_DATE..tsv append
--列ヘッダを表示する
SET HEAD ON
--取得したいSQL実施
SELECT
*
FROM
DUAL
;
spool off
・呼び出すbatは下記のような感じ
title.rb
--実行するDBの文字コードに合わせて設定(下記はUTF-8)
chcp 65001
SET NLS_LANG=Japanese_Japan.AL32UTF8
salplus ユーザ名@接続先/パスワード @test.sql
exit