#!/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
このスクリプトを強制的に失敗させようとして、ガベージ値を入力しています。しかし、迷惑なことに、エラーコードに言及することなく前進し続けます。ここで他に何をする必要がありますか?
マックスの言うことは正しい。この変更されたスクリプトを試してください
#!/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 をご覧ください。
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
アジの答え
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コードをカットします。
偽の値を入力しているという事実は、おそらくログインにのみ関連しています。次に: シェルスクリプトを使用してデータベース接続を確認
WHENEVER ...
は、SQLスクリプトの実行中のエラー用です。スクリプトに正常に接続できたら(今はこれが問題だと思います)、WHENEVER ERROR
の行でEXEC
を忘れてしまったため、DBMS_OUTPUT
で管理されているようなエラーが発生するはずです。
トラップできるのは、SQLエラーまたはOSエラーのみです。 dbms_outputは、sqlplusレベル自体で失敗するため、エラー設定がエラーに影響することはありません。