以下是我脚本的一部分。 每当负面返回代码来自任何命令时,“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"
答案 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)将提交正在进行的事务。