当select查询没有返回任何行时,Unix脚本退出

时间:2014-09-04 15:32:53

标签: database unix db2 ksh aix

以下是我脚本的一部分。 每当负面返回代码来自任何命令时,“set -e”将使脚本退出。

但是,当下面的select语句没有从表中返回任何行时,脚本会自动退出(echo“Get Eg names end”不会被执行)。这意味着下面的命令给出了否定的返回码。

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语句返回一些行,它可以正常工作。脚本不会退出并运行到最后。

我的要求是在发生真正的错误时退出,例如无法连接数据库,语法无效等。 如果表中没有返回任何行,则不应将其视为错误。

为什么我为select查询获取-ve返回代码而不返回行?我该如何处理?

以下是脚本的一部分:

#!/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"

1 个答案:

答案 0 :(得分: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 stmts在单独的文件中

将所有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)将提交正在进行的事务。