ファイル数が多いのが嫌だ
- OracleのSQL*Plusをバッチファイルで実行するとき、SQL文が書かれたファイルのパスを指定します
ちょっとしたSQLを実行するのにBATファイルとSQL記述ファイルの2つを用意しなければなりません
Unixのシェルスクリプトではヒアドキュメントの仕組みを利用すると、スクリプト内に標準入力のテキスト
を記述できるため、1ファイルに収めることができます - そこで、Windows環境でバッチファイルとSQL文を一つのファイルにできないかということ
基本的な構造
- ファイル名の拡張子は.batにします
拡張子を.batにすることによってダブルクリックでバッチファイルとして起動します - SQLPLUSのコマンドラインオプションで自分自身を読み込むようにします
SQLPLUS @"%~f0"
と指定すると自分自身をSQLファイルとして実行します - バッチファイルとして実行する部分はSQLPlusにとって無視できるようコメント行になるようにします
SQLPlusの入力SQLは以下のコメント形式があります
・ 行頭にREM
と記述すると、その行はコメント行となります
・ 行の途中に--
があると、行末までコメントとなります
・ /*
と*/
に囲まれた部分はブロックコメントとなります
一方、バッチファイルでも行頭のREM
はコメントとして扱われます
また、^
が行の途中にあると次の行も併せて1行として処理されます
この仕組みを利用して、以下のような構造にします
sample.bat
1 REM ^
2 /*
3 バッチコマンド行
4 SQLPLUS @"%~f0"
5 EXIT
6 */
7 SQL文
バッチファイルとしては、1,2行目がコメントとなるので、3,4,5行と順に実行し、5行めのEXITで終了します
一方、SQLPLUSの入力文としては、1行目は行コメント、2~6行目まではブロックコメントになるので、7行目のSQLが実行されます
実際の例
こんな感じで書けます
ORA_SQLPLUS.BAT
Rem ^
/*
@Echo Off
Cls
SET Path=%Path%;C:\Program Files\instantclient_12_2
SET CONN=user/pass@hostname:1521/pdb1
SET NLS_LANG=japanese_japan.ja16sjis
sqlplus %CONN% @"%~f0"
Pause
Exit /b
*/
-- ここから SQL*Plus で読み込む SQL
DELETE FROM SAMPLE_TBL
WHERE DEL_FLG = '1';
COMMIT;
EXIT