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.