2014-09-04 62 views
0

以下是我的腳本的一部分。 「set -e」將使腳本在任何命令出現負面返回碼時退出。在選擇查詢不返回行時退出Unix腳本

但是,當下面的select語句沒有從表中返回任何行時,腳本自身退出(echo「Get Eg names ends」未執行)。這意味着下面的命令給出了負面的返回碼。

db2 -x "SELECT EG_NAME FROM MS.CFG_CACHE_REFRESH WHERE 
EG_RELOAD_UPD_BK2_TS < M_TABLE_UPD_TS AND CURRENT_TIME >= EG_RELOAD_START_TIME AND 
CURRENT_TIME <= EG_RELOAD_END_TIME" 
> /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt 

如果select語句返回一些行,它可以正常工作。該腳本不會退出並運行至結束。

我的要求是在出現真正的錯誤時退出,如無法連接數據庫,語法無效等。 如果表中未返回任何行,則不應將其視爲錯誤。

爲什麼我得到一個-ve返回代碼的select查詢不返回行,我該如何處理?

下面是腳本的一部分:

#!/bin/ksh 
set -e 
brokername=$1 

if [ "$#" -ne "1" ] 
    then 
echo "Invalid arugments supplied" 
echo "call the script using command:" 
echo "MP_CACHE_REFRESH_BRK2.ksh <BrokerName>" 

exit -1 
fi 

touch /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt 
chmod 777 /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt 
db2 CONNECT TO MSAPP USER DummyUser using paasss 
db2 -x "SELECT EG_NAME FROM MS.CFG_CACHE_REFRESH WHERE EG_RELOAD_UPD_BK2_TS < M_TABLE_UPD_TS AND CURRENT_TIME >= EG_RELOAD_START_TIME AND CURRENT_TIME <= EG_RELOAD_END_TIME" > /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt 
echo "Get Eg names end" 
+0

我認爲最好不要使用'set -e',而是直接檢查你感興趣的命令的退出代碼($?) – 2014-09-04 16:44:29

+0

@IngoLeonhardt謝謝你的迴應。實際上面是完整腳本的非常小的部分,並且在我們認爲可能發生錯誤的每個命令之後檢查返回代碼實際上會耗費更多時間。我正在尋找一種方法來設置-e。 – nitgeek 2014-09-04 17:03:08

+0

我真的無法想象與數據庫訪問相比,(通常內置的)測試命令可能會有任何重要的性能問題。此外,明確地檢查退出代碼會讓您自由地輸出錯誤消息等。 – 2014-09-04 17:15:35

回答

3

的問題不是負的返回碼,它是任何返回代碼,= 0 DB2退出時:

- 0, success 
- 1, no row found 
- 2, warning (for example using existing index instead of creating a new one) 
- 4, error (for example object not found) 
- 8, system error (os related) 

除非你包裝db2並返回0爲$? -lt 4我不明白你將如何成功。關於如何處理DB2退出代碼(-e刪除)例

db2 -x "SELECT EG_NAME FROM MS.CFG_CACHE_REF ..." 
rc=$? 
if [ $rc -ge 4 ]; then 
    ... 

編輯:在單獨的文件中SQL支桿替代

保持所有的SQL在一個單獨的文件 - 說myfile.sql - 你可以從你的sh執行類似的操作:

db2 -l myfile.log +c -s -tf myfile.sql 
rc=$? 
if [ $rc -ge 4 ]; then 
    echo "Error" 
    db2 rollback 
    exit 1 
elif [ $rc -ge 1 ]; then 
    echo "Warning" 
fi 

db2 commit 
exit 0 

-s在錯誤(-ge 4)時終止執行。您可以通過拖拽日誌文件tail -10 myfile.log來找出造成問題的原因。請注意,reorg等特定操作將會執行正在進行的事務。

+0

謝謝。所以,「設置-e」會使腳本在任何非零RC的情況下退出。您是否知道是否有任何替代方法僅適用於-ve RC?如果不是,那麼我可能沒有其他選擇,只能在我的腳本中處理100s的選擇語句的RC :-( – nitgeek 2014-09-05 15:29:17

+0

我會更新我的答案並附加一些信息 – Lennart 2014-09-05 15:35:06