sknt

4歩進んで5歩戻る

バッチでSQLをキックし、実行したSQL構文をログとして残す

実行・開発環境

Oracle Express Edition 11.2.0.2.0

やりたいこと

batからキックしたsqlのログを残す

呼び出し用バッチファイル

pushd %0\..
sqlplus TESTUSER1/P @sql\output.sql
pause

output.sql

col id for a10
col note for a10
spool output.log
select * from t_table1;
spool off
exit

結果(×) - output.log


ID         NOTE                                                                 
---------- ----------                                                           
2          テスト                                                               
2          テスト                                                               

事象

batからsqlをキックしsql内でspoolすると、実行したsqlが出力されない。
sqlplusをコマンドプロンプトから起動し、sqlを貼りつけたときはsqlが残る。

原因

原因は、システム変数 ECHO のデフォルトが OFF だったため。

システム変数 ECHO とは
@、@@またはSTARTを使用して実行するスクリプトでコマンドをエコー表示するかどうかを制御します。 ONを指定すると、画面にコマンドが表示されます。 OFFを指定すると、非表示になります。 ECHOは、対話方式で入力するコマンドまたはオペレーティング・システムからSQL*Plusにリダイレクトするコマンドの表示には影響しません。

http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05784-01/ch12040.htm#i2698923

対応

sqlに「set echo on」を追記する。

参考サイト

SET ECHO - オラクル・Oracle SQL*Plus リファレンス

以下は、修正したコード。

呼び出しbat

pushd %0\..
sqlplus TESTUSER1/P @sql\output.sql
pause

sql\output.sql

col id for a10
col note for a10
set echo on
spool output.log
select * from t_table1;
spool off
exit

結果(○) - output.log

SQL> select * from t_table1;

ID         NOTE                                                                 
---------- ----------                                                           
2          テスト                                                               
2          テスト                                                               

SQL> spool off