web-dev-qa-db-ja.com

シェルスクリプトからsqlplusを実行中のエラー処理の管理

#!/bin/sh

echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name

LOGFILE=Shell_log.txt

$Oracle_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
connect $eval_user/$eval_pass@$db_name
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
DBMS_OUTPUT.put_line('Connected to db');
EOF

if [ $? != 0 ]
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $?"
exit 0;
fi

このスクリプトを強制的に失敗させようとして、ガベージ値を入力しています。しかし、迷惑なことに、エラーコードに言及することなく前進し続けます。ここで他に何をする必要がありますか?

14
roymustang86

マックスの言うことは正しい。この変更されたスクリプトを試してください

#!/bin/sh

echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name

LOGFILE=Shell_log.txt

sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF

sql_return_code=$?

if [ $sql_return_code != 0 ]
then
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $sql_return_code"
exit 0;
fi

Sql_return_codeを使用してSQLPLUS戻りコードをキャプチャすることに注意してください。

DBMS_OUTPUTステートメントはエラーで失敗するはずです-「SP2-0734:unknown command starting ...」。ログファイルでエラーメッセージを見つけることができます。

エラーロギング機能を使用して、SQLPLUS 11gのsp2エラーをトラップすることができます。詳細については http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html をご覧ください。

13
Aji Mathew

dbへの接続が確立された後、wheneverステートメントが実行される可能性があります(後で言及しているため)。次のコードを試してください:-

$Oracle_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF
6
Max

アジの答え

WHENEVER SQLERROR EXIT SQL.SQLCODE;

そして次に

sql_return_code=$?

正しくない(またはほとんどの場合正しくない)。以下の詳細を参照してください。


UNIX OSのシェルスクリプトは、最大255個のコードを返すことができます。 「ORA-12703この文字セット変換はサポートされていません」リターンコードは12703である必要がありますが、UNIX 8ビットリターンコードには適合しません。
実際にテストを行って、「ORA-00936:表現がありません」で失敗する不正なSQLを実行しました-
sqlplusは168(!)を返しました。
したがって、実際のリターンコード936は256でラップされ、残りだけが返されました。 936%256 = 168。


Windowsではおそらく動作する可能性があります(テストされていません)が、UNIXでは動作しません(上記で説明したようにテストされています)。


唯一の信頼できるメカニズムは、おそらく結果をログファイルにスプールしてから、次のようなことをすることです。

tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2

そのため、スプールログファイルをgrepし、実際の最新のORAコードをカットします。

4
Tagar

偽の値を入力しているという事実は、おそらくログインにのみ関連しています。次に: シェルスクリプトを使用してデータベース接続を確認

WHENEVER ...は、SQLスクリプトの実行中のエラー用です。スクリプトに正常に接続できたら(今はこれが問題だと思います)、WHENEVER ERRORの行でEXECを忘れてしまったため、DBMS_OUTPUTで管理されているようなエラーが発生するはずです。

1
Plouf

トラップできるのは、SQLエラーまたはOSエラーのみです。 dbms_outputは、sqlplusレベル自体で失敗するため、エラー設定がエラーに影響することはありません。

0
rajesh