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

Posted

技术标签:

【中文标题】通过 shell 脚本执行合并时出错【英文标题】:Error while executing Merge through shell script 【发布时间】:2018-12-27 10:06:01 【问题描述】:

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

我不确定出了什么问题。

【问题讨论】:

$ERRORCODE 值将被包装为 $? 的最大值为 255。因此 174 可能是很多实际值。在您的脚本中打印$Result 以查看实际发生的情况。我想你实际上得到了 ORA-00942,它会包装到 174,所以检查你的表名和权限。 (另请注意,包装意味着您可能会在实际抛出错误时看到零,并错过它......所以这不是一个安全的检查。) @AlexPoole - 很好的信息。我不知道。 【参考方案1】:

使用exit sql.sqlcode 可能会产生误导,甚至是危险的。

来自The Linux Documentation Project:

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

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

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

这表明报告的退出代码可能会造成混淆或误导。如果你得到一个真正的错误代码,它是 256 的精确倍数,则潜在的危险部分,例如似是而非的 ORA-01536“表空间 %s 超出空间配额”。由于mod(1536, 256) 为零,$ERRORCODE 将为零也是,所以你的支票:

if [ $ERRORCODE != 0 ]

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

将 SQL 更改为whenever sqlerror exit failure 可能会更简单(可能加上rollback?),然后您的非零检查将起作用;并且您可以使用$Result 查看/报告实际错误。

【讨论】:

以上是关于通过 shell 脚本执行合并时出错的主要内容,如果未能解决你的问题,请参考以下文章

linux文件合并,关键字去重复shell脚本

将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法

在 pig 脚本中执行 shell 命令时出错

Shell合并两个文件成一个文件的两列

shell脚本,awk合并一列的问题。

shell脚本中能否有空行