通过 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(<actual code>, 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 脚本执行合并时出错的主要内容,如果未能解决你的问题,请参考以下文章
将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法