【问题标题】:Capturing return codes from Sybase stored procedure in korn shell script在 korn shell 脚本中从 Sybase 存储过程中捕获返回码
【发布时间】:2014-03-17 20:08:53
【问题描述】:

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

【问题讨论】:

  • @@error 存储最后一条语句的错误。如果没有错误,则返回 0,如果发生错误,则返回特定的错误号。

标签: shell stored-procedures sybase isql


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    $!变量返回 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多