繁体   English   中英

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

[英]Error while executing Merge through shell script

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

我不确定出了什么问题。

使用exit sql.sqlcode可能会引起误解,甚至是危险的。

来自Linux文档项目

超出范围的退出值可能会导致意外的退出代码。 大于255的退出值将返回以256为模的退出代码。例如,出口3809给出的退出代码为225(3809%256 = 225)。

您看到的退出代码报告为174,但是原始错误代码可能是mod(<actual code>, 256)计算为174的任何内容。您将能够在$Result看到实际的错误代码和消息。 $Result变量。

可能的候选者是ORA-00942错误(因为mod(942, 256)为174)-正如您所说的合并是独立运行的,您可能会发现您正在连接并以以下身份运行该用户由$TgtUsrID表示的对FSG和/或FSG_WRK拥有的表没有必需的特权。

这表明报告的退出代码可能会造成混淆或误导。 如果您得到的实际错误代码是256的整数倍,则可能是危险的部分,例如,合理的ORA-01536“表空间%s的空间配额超出了。由于mod(1536, 256)为零, $ERRORCODE将也为零,所以您的检查:

if [ $ERRORCODE != 0 ]

即使确实发生错误,也会为假。

whenever sqlerror exit failure更改您的SQL可能会更简单(也许添加了rollback吗?),然后您可以检查非零值。 您可以使用$Result查看/报告实际出了什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM