ググると結構出てきますが、備忘として。
sqlplus コマンドは、実行するSQL文を標準入力から読み込むことができます。
シンプルな実行例
> echo select * from dual; | sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on 金 1月 6 01:23:45 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
に接続されました。
SQL>
D
-
X
SQL> Oracle Database 11g Release 11.2.0.3.0 - 64bit Productionとの接続が切断されました。
これを使うと、バッチファイル中にちょっとしたSQL文をかけて、なおかつ「一時SQLファイル」といったファイルを作らなくて済みます。
そのため、例えば、今回のバッチで必要な DIRECTORY を一時的に作りたい、一時データを消したい、といった場面で重宝します。
実行状況をコンソールから眺めていると「SQL>」の表示で一旦固まりますが、しばらくすると実行されていきます。
※一旦固まる現象は、環境によるのかもしれません。
単一の文を実行
単一.bat
set CONN=scott/tiger
echo drop directory aaadir; | sqlplus %CONN%
echo create directory aaadir as 'd:/aaa'; | sqlplus %CONN%
REM 何か処理をする...
echo drop directory aaadir; | sqlplus %CONN%
複数の文を一気に実行
複数.bat
set CONN=scott/tiger
(
echo select * from dual;
echo select 1 from dual;
) | sqlplus %CONN%
REM 何か処理をする...
注意点(ログの残し方)
冒頭の「シンプルな実行例」にあるように、標準入力で渡したSQL文は標準出力に出力されません。
SQL*Plus の実行結果をログに出力したい場合、標準出力だけを使っているとSQL文がログに残らない(実行結果はログに残る)ということに注意が必要です。
何を実行したか不明なログのとりかた.bat
set CONN=scott/tiger
echo select * from dual; | sqlplus %CONN% > hoge.log
実行結果(hoge.log)
SQL*Plus: Release 11.2.0.1.0 Production on 金 1月 6 01:23:45 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
に接続されました。
SQL>
D
-
X
SQL> Oracle Database 11g Release 11.2.0.3.0 - 64bit Productionとの接続が切断されました。
対策1. 別途、処理内容を出力する
対策としては、SQL文を実行する手前でログファイルに処理内容を出力するようにすることが考えられます。
最低限の状況説明を出力する.log
set CONN=scott/tiger
echo 【接続テスト】 > hoge.log
echo select * from dual; | sqlplus %CONN% >> hoge.log
実行結果(hoge.log)
【接続テスト】
SQL*Plus: Release 11.2.0.1.0 Production on 金 1月 6 11:02:07 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
に接続されました。
SQL>
D
-
X
SQL> Oracle Database 11g Release 11.2.0.3.0 - 64bit Productionとの接続が切断されました。
対策2. SPOOL を使う
また、SPOOL で指定したファイルには、標準入力で渡したSQL文が出力されました。
SPOOLを使ったログ出力.bat
set CONN=scott/tiger
echo 前処理... > hoge.log
(
echo spool d:/spool_hoge.log
echo select * from dual;
echo spool off
) | sqlplus %CONN%
rem 結果が重複するので、sqlplus の標準出力は使わない
type d:\spool_hoge.log >> hoge.log
実行結果(hoge.log)
前処理...
SQL> select * from dual;
D
-
X
SQL> spool off