1

我在捕获存储过程的返回码时遇到了问题。我正在使用 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)

但这并没有给我预期的结果。当我回显返回码时,它回显为 0,即使在将状态返回为 1 之后也是如此。在 sql 日志中看到返回状态为 1。

4

2 回答 2

1

要捕获 sql 语句中的错误,您需要查看@@error

returncode=`isql -U ${APPLID} -S{SERVER}> ${sqlMsg} << EOF
             use ${DATABASE}
             go
             exec stored_procedure
             go
             select @@error
             go 
 EOF`

这应该允许您的 if 条件按您的预期工作。

于 2014-02-18T14:25:48.253 回答
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
于 2014-02-18T09:33:18.973 回答