在 Sybase ASE 15.0 中处理从一个存储过程到另一个存储过程的错误
Handling error from one stored procedure into another in Sybase ASE 15.0
我需要根据特定条件在 Sybase ASE 数据服务器上执行密码重置:
if validations_here
begin
exec sp_password 'sso_passw', 'new_passw', @userid
end
sp_password
可能会引发一些错误,例如10316 - "New password supplied is the same as the previous password"。虽然我找不到任何文档,但我认为它们不应该是致命错误,应该可以用 raiserror
.
来模拟它们
由于调用者以这种方式处理它会更容易,我想获取错误代码并将其 return 作为结果集的一部分,所以我考虑了 SELECTing @@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
的参数是错误的)。
如何从我的存储过程中 "catch" sp_password
的错误代码?
许多 "sp_" 存储过程在出现问题时设置非零 return 代码。通常处理此 return 代码比尝试捕获存储过程中引发的错误更好。 IIRC,使用 T运行sact-SQL 不可能进行这种捕获;需要第三代语言,例如 C。
获取myproc存储过程的return代码到变量@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_passwordreturn代码,其值为1,如(returnstatus=1)在最后一行消息中。它不为零的原因很清楚:sp_password、10315 和 17720 中有两个错误。关键是要关注这个非零 return 代码并忽略 10315 和 17720。在您的存储过程中, @spreturn 应该针对零进行检查。如果为零 运行 OK,否则失败。
我需要根据特定条件在 Sybase ASE 数据服务器上执行密码重置:
if validations_here
begin
exec sp_password 'sso_passw', 'new_passw', @userid
end
sp_password
可能会引发一些错误,例如10316 - "New password supplied is the same as the previous password"。虽然我找不到任何文档,但我认为它们不应该是致命错误,应该可以用 raiserror
.
由于调用者以这种方式处理它会更容易,我想获取错误代码并将其 return 作为结果集的一部分,所以我考虑了 SELECTing @@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
的参数是错误的)。
如何从我的存储过程中 "catch" sp_password
的错误代码?
许多 "sp_" 存储过程在出现问题时设置非零 return 代码。通常处理此 return 代码比尝试捕获存储过程中引发的错误更好。 IIRC,使用 T运行sact-SQL 不可能进行这种捕获;需要第三代语言,例如 C。
获取myproc存储过程的return代码到变量@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_passwordreturn代码,其值为1,如(returnstatus=1)在最后一行消息中。它不为零的原因很清楚:sp_password、10315 和 17720 中有两个错误。关键是要关注这个非零 return 代码并忽略 10315 和 17720。在您的存储过程中, @spreturn 应该针对零进行检查。如果为零 运行 OK,否则失败。