gpt4 book ai didi

stored-procedures - 在 Sybase ASE 15.0 中处理从一个存储过程到另一个存储过程的错误

转载 作者:行者123 更新时间:2023-12-03 08:28:39 25 4
gpt4 key购买 nike

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

if validations_here
begin
exec sp_password 'sso_passw', 'new_passw', @userid
end
sp_password可能会引发一些错误,例如10316 - “提供的新密码与以前的密码相同”。虽然我找不到任何文档,但我认为它们不应该是 fatal error ,应该可以用 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并确定为 ret_msg (即使 sp_password 的参数是错误的)。

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

最佳答案

当出现问题时,许多“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 是否为零.如果为零,则运行正常,否则失败。

关于stored-procedures - 在 Sybase ASE 15.0 中处理从一个存储过程到另一个存储过程的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com