【问题标题】:Handling error from one stored procedure into another in Sybase ASE 15.0在 Sybase ASE 15.0 中处理从一个存储过程到另一个存储过程的错误
【发布时间】:2015-10-22 19:40:09
【问题描述】:

我需要根据某些条件在 Sybase ASE 数据服务器上执行密码重置:

if validations_here
begin
    exec sp_password 'sso_passw', 'new_passw', @userid
end

sp_password 可能会引发一些错误,例如10316 - “提供的新密码与之前的密码相同”。虽然我找不到任何文档,但我认为它们不应该是致命错误,应该可以用 raiserror 模拟它们。

由于调用者以这种方式处理它会更容易,我想获取错误代码并将其作为结果集的一部分返回,所以我考虑选择@@error。我的代码如下(我只转录了那些我认为与问题相关的部分):

create procedure sp_desbloc_blanqueo_usr    
    @userid sysname,        
    @sso_pass varchar(20),  
    @new_pass varchar(20)   
as
begin
    declare @ret_code int
    declare @ret_msg varchar(100)
    declare @myerror int

    select @ret_code = 0, @ret_msg = 'OK'

    exec sp_password @sso_pass, @new_pass, @userid
    set @myerror = @@error 
    if @myerror <> 0
    begin
        select @ret_code = @myerror, @ret_msg = 'Error occurred changing password' 
        -- It would be nice to have the actual error message as well
        goto fin
    end

    fin:
    select @ret_code as ret_code, @ret_msg as ret_msg
end

但是,每当我执行存储过程时,我得到 0 作为ret_code 和 OK 作为ret_msg(即使sp_password 的参数是错误的)。

如何从我的存储过程中“捕获”sp_password 的错误代码?

【问题讨论】:

  • @MichaelGardner 我不想重置@@error。我想获得引发的错误代码,并防止 SP 异常终止。您提到的问题没有回答我的问题。
  • 请重新阅读答案。您不能将 raiseerror 与字符串一起使用。您必须使用 sp_addmessage 作为错误文本。
  • 谢谢,我明白你的意思了。由于我的测试不准确,我将使用实际代码编辑问题。
  • 这可能也有帮助 - scn.sap.com/thread/3812744

标签: stored-procedures error-handling sybase sap-ase raiserror


【解决方案1】:

当出现问题时,许多“sp_”存储过程会设置一个非零返回码。通常处理这个返回码比试图捕捉存储过程中引发的错误要好。 IIRC,Transact-SQL 无法实现这种捕获;需要第三代语言,例如 C。

要获取myproc存储过程的返回码到变量@myvar中,语法是

exec @myvar = myproc [arguments] 

带有 sp_password 的简单示例:

declare @spreturn int  
exec @spreturn = sp_password 'notmyoldpw', 'notmynewpw'  
print "Return from sp_password is %1!", @spreturn  
go

Server Message:  Number  10315, Severity  14  
Server 'SDSTRHA01_SY01', Procedure 'sp_password', Line 148:  
Invalid caller's password specified, password left unchanged.  
Server Message:  Number  17720, Severity  16  
Server 'SDSTRHA01_SY01', Procedure 'sp_password', Line 158:  
Error:  Unable to set the Password.  
(1 row affected)  
Return from sp_password is 1  
(return status = 1)  

第一行定义的int变量@spreturn得到sp_password返回码,返回码为1,如最后消息行中的(return status = 1)所示。它不为零的原因很清楚:sp_password 中有两个错误,10315 和 17720。重点是关注这个非零返回代码并忽略 10315 和 17720。在您的存储过程中,应该检查 @spreturn 是否为零.如果为零,则运行正常,否则失败。

【讨论】:

  • 这是一个非常好的方法。这样我至少可以通知调用者那里有错误。是否可以知道发生了哪些错误?
  • 除非它在最新版本中有所改变,否则不可能从存储过程或 T-SQL 批处理内部进行。如果有的话,最后一个错误可能仍然可以从@@error 获得,这取决于它是否出现在存储过程中的最后一个语句中。 Open Client 应用程序(例如,用 C 编写的)可以获取它们;毕竟,这就是 isql 工具在报告结果和错误时所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多