sqlplus を呼び出すシェル スクリプトは次のとおりです。
#!/usr/bin/ksh
sqlplus $USER/$PASSWD@$DB<<!!>./logFile.log
SELECT 'IN sqlplus' FROM dual;
DECLARE tbl_xst integer;
SELECT COUNT(*) INTO tbl_xst FROM SYS.ALL_TABLES
WHERE table_name = 'SOME_TABLE'
AND OWNER = 'SOME_OWNER';
IF tbl_xst = 1 THEN
BEGIN
DROP TABLE SOME_OWNER.SOME_TABLE;
END
END IF
SELECT 'The end' FROM dual;
!!
シェル スクリプトを実行してログ ファイル logFile.log を調べると、次のような内容が表示されます。
SQL*Plus: Release 10.2.0.3.0 - Production on Mon Oct 22 12:33:05 2012
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
SQL> SQL>
'INSQLPLUS
----------
IN sqlplus
SQL> SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Disconnected from Oracle Database 11g Enterprise Edition Releas
e 11.2.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
ご覧のとおり、最初のロギング SELECT ステートメント ('IN sqlplus') は成功しますが、一番下の 2 番目のステートメントは成功しません。つまり、間にエラーがあるため、実行は到達しません。sqlplus がこのエラー メッセージをログ ファイルに書き込まないのはなぜですか?
いくつかのコメントの後に編集: sqlplus が指定されたログ ファイルに STDERR をダンプせず、STDOUT のみが記録されることが原因である可能性が最も高いことを確認しました。sqlplus コマンドをフォーマットして、両方のストリーム (STDOUT と ERR) を結合し、指定したログ ファイルに入れるにはどうすればよいですか? <<!!>
ここで重要だと思います。
さらに実験した後に編集: 奇妙なことに、いくつかのエラー メッセージが STDOUT にダンプされています。不適切な DB オブジェクトを参照しようとする、適切に構文化されたものだと思います。SQL コンパイル エラーが発生した場合、明らかに STDERR に入ります。私がしたことは、上記の最初の SELECT と DECLARE の後に次の行を挿入することです。
DROP TABLE FAKE_NONEXISTING;
ステートメントは正当であり、コンパイルされますが、FAKE_NONEXISTING は存在せず、ログ ファイルに次のように表示されます。
SQL> SQL> DROP TABLE FAKE_NONEXISTING
*
ERROR at line 1:
ORA-00942: table or view does not exist
ただし、ログ ファイルには、SQL コンパイル エラーと思われるものは何も記録されません。