簡體   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