0

Oracle sqlplus を実行してバックグラウンドで SQL スクリプトを実行するシェル スクリプト (ksh) を実行しようとしています。WHENEVER SQLERROR EXIT SQL.SQLCODEエラーコードをトラップするために使用しているSQLスクリプト内で、エラーコードを確認してプログラムを終了し、それ以外の場合は次のSQLステートメントに進みます。

問題がエラーをトラップするシェル スクリプトにあるのか、WHENEVERそれとも ?の使用にあるのかわかりません。エラーを生成/呼び出していORA-ますが、リターン コードはReturn_code=0,引き続き (pass) と表示され、次のスクリプトを実行し続けます。失敗してプログラムを終了する必要があります。

誰かがこのスクリプトを適切に構成するのを手伝ってくれますか? 私のif-then-else論理にも欠陥があるかもしれません。ありがとう。

エラーを呼び出すための私のSQL(whenever.sql)スクリプトは次のとおりです。

WHENEVER SQLERROR EXIT SQL.SQLCODE
begin
  SELECT COLUMN_DOES_NOT_EXIST FROM DUAL;
END;
/

これが私のスクリプトです:

KEY=$BASEDIR/.keyinfo;
LOG=$BASEDIR/run_tst.log;

# Check before we run
if [ -f "$KEY" ]
then
IFS="
"
set -A arr $(cat $KEY)
echo "Running Test ===>$TIMESTAMP" >> $LOG 2>&1
/bin/sqlplus ${arr[0]}/${arr[1]} @whenever.sql &
pid1=$!
echo "Waiting for PID:$pid1" >> $LOG 2>&1
wait $pid1
ret=$?
echo "Return_code=$?"  >> $LOG 2>&1
if [ $ret !=0 ] #if not success
then
     exit $ret
     echo "Error found...Return_code=$?" >> $LOG 2>&1
     echo "Error found...exiting program ===>$TIMESTAMP" >> $LOG 2>&1
     exit 1
else
     /bin/sqlplus ${arr[0]}/${arr[1]} @tst2.sql
fi
else
   echo "key not found. Exiting.  ==>$TIMESTAMP" $LOG 2>&1
fi
exit 0

結果 (0 を表示しています。エラーがあるため、0 以外の値である必要があります)。

Running Test ===>20130825-09:25
Waiting for PID:6383
Return_code=0

私も試してみましたがWHENENVER SQLERROR EXIT 1、それでも同じ結果が得られますReturn_code=0

テストからの出力:

Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

  SELECT COLUMN_DOES_NOT_EXIST FROM DUAL;
         *
ERROR at line 2:
ORA-06550: line 2, column 10:
PL/SQL: ORA-00904: "COLUMN_DOES_NOT_EXIST": invalid identifier
ORA-06550: line 2, column 3:
PL/SQL: SQL Statement ignored


Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
./run.sh[38]: test: Specify a parameter with this command.
4

2 に答える 2

1

これで戻りコードを表示すると:

ret=$?
echo "Return_code=$?"  >> $LOG 2>&1

... theは、以前の ではなく、前の行$0の の代入の結果になりました。そのため、常に 0 になるように gping されます。また、ブロックには早期終了があり、その後はメッセージが表示されず、テスト条件にスペースがありません (私はそうする方が好きです):retsqlplusif-ne!=

...
ret=$?
echo "Return_code=$ret"  >> $LOG 2>&1
if [ $ret -ne 0 ] #if not success
then
     echo "Error found...Return_code=$ret" >> $LOG 2>&1
     echo "Error found...exiting program ===>$TIMESTAMP" >> $LOG 2>&1
     exit $ret
else
...

また、変数を中かっこで囲むことも好みますが、${ret}あいまいさがない限り、それは好みの問題だと思います。sqlplusちなみに、-sフラグを使用してログのバナーを非表示にすることもできます。

于 2013-08-25T22:26:03.877 に答える