2014-09-04 61 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