通过Shell脚本执行合并时出错

时间:2018-12-27 10:06:01

标签: sql oracle shell sqlplus

我正在尝试执行一个通过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

我不确定出了什么问题。

1 个答案:

答案 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来查看/报告实际出了什么问题。