[英]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.