我正在尝试执行一个通过sqlplus调用Merge语句的脚本。
merge语句执行得很好,但是当我通过shell脚本执行它时,出现了错误:
current_time=`date`
echo "FSG_PRCB_PRVD_FAC_SEQ table UPDATE STARTED at $current_time"
Result=`sqlplus -s $TgtUsrID/$TgtPswd@$TgtServer <<eof
whenever sqlerror exit sql.sqlcode;
merge into FSG_WRK.FSG_PRCB_FAC_REF_DATA T1
using
(select NUM_ID, ALPHA_NUM_ID from FSG.FSG_PRCB_ADDRESS_CROSSWLK) T2
ON (T1.ADDR_TYPE=T2.ALPHA_NUM_ID)
when matched then
update set T1.ADDR_TYPE_N = T2.NUM_ID ;
eof
`
ERRORCODE=$?
#Check the return code from SQL Plus
if [ $ERRORCODE != 0 ]
then
echo "********************"
echo "ERROR: Updating Status Failed. ErrorCode: $ERRORCODE"
exit -1
else
echo "********************"
echo "UUpdating Status returns $Result"
current_time=`date`
echo "Updating Status Query finished at $current_time"
fi
输出:
更新状态失败。错误代码:174
我不确定出了什么问题。
答案 0 :(得分:2)
使用exit sql.sqlcode
可能会引起误解甚至是危险。
来自The Linux Documentation Project:
超出范围的退出值可能会导致意外的退出代码。退出值大于255会返回以256为模的退出代码。例如,退出3809给出的退出代码为225(3809%256 = 225)。
您看到的退出代码报告为174,但是原始错误代码可能是mod(<actual code>, 256)
计算为174的任何内容。您将能够在{{ 1}}变量。
可能的候选者是ORA-00942错误($Result
为174)-正如您所说的合并是独立运行的,您可能会发现您正在连接并运行该用户由mod(942, 256)
表示的merge as在$TgtUsrID
和/或FSG
所拥有的表上没有必要的特权。
这表明报告的退出代码可能令人困惑或误导。如果您得到的实际错误代码是256的精确倍数,则可能是危险的部分,例如,可能的ORA-01536“表空间%s的空间配额超出。由于FSG_WRK
为零,因此{{1} }也将为零,因此您进行检查:
mod(1536, 256)
即使发生错误也将为假。
将您的SQL更改为具有$ERRORCODE
(可能会加上if [ $ERRORCODE != 0 ]
?)可能会更简单,然后您可以检查非零值;您可以使用whenever sqlerror exit failure
来查看/报告实际出了什么问题。