我在捕获存储过程的返回代码时遇到了问题。 我正在使用isql语句在我的korn shell脚本中调用sybase存储过程,如下所述。
isql -U ${APPLID} -S{SERVER}> ${sqlMsg} << EOF
use ${DATABASE}
go
exec stored_procedure
go
EOF
returncode=$?
如果存储过程中发生错误,我无法捕获是否遵循以下方法。
if [ $returncode -ne 0 ]
then
print "failed"
fi
我尝试在存储过程中使用return语句
return (1)
但这并没有给我预期的结果。当我回显返回码时,即使将状态返回为1,它也会回显为0。 在sql日志中看到返回状态为1。
答案 0 :(得分:1)
要捕获sql语句中的错误,您需要查看@@error
returncode=`isql -U ${APPLID} -S{SERVER}> ${sqlMsg} << EOF
use ${DATABASE}
go
exec stored_procedure
go
select @@error
go
EOF`
这应该允许你的if条件按预期工作。
答案 1 :(得分:0)
$!变量返回isql程序的执行状态,而不是存储过程状态。 这就是回显的返回代码打印0的原因:isql程序本身工作正常。
要捕获商店过程的输出,我会将其重定向到外部输出文件并读取它。 isql实用程序有几个用于使用输入/输出文件进行操作的选项, 例如-i input_file和-o output_file,用于相应地指定输入和输出文件。如果您的存储过程有输出,它将被发送到output_file。 现在,您可以通过简单的“cat”或更复杂的循环从脚本中读取output_file内容,具体取决于output_file内容。要创建具有唯一名称的输出文件,请使用$$变量,该变量为您提供脚本的当前PID。最后删除输出文件。
#!/bin/bash
output_file=output.$$
isql with all your prameters and -o $output_file
status=`cat $output_file`
echo $status
rm $output_file