目前我用这种方式编写存储过程:
create proc doStuff
@amount int
as
begin try
begin tran
...
if something begin select 'not_good' rollback return end
if someelse begin select 'some_other_thing' rollback return end
--do the stuff
...
commit
end try
begin catch
if @@trancount > 0 rollback
select 'error'
end catch
这种方法的问题在于我隐藏了错误,有人知道这样做吗?
答案 0 :(得分:3)
您使用的数据库是什么?在SQL Server中,您可以使用关键字RASIERROR生成错误消息。见RAISERROR (Transact-SQL)
答案 1 :(得分:2)
在这里假设SQL Server,因为它看起来很像SQL Server语法:
最好,您还应该使用SAVE TRAN
,这样您就可以将该过程视为自己的工作单元,并让调用者选择是否回滚整个事务(而不是只回滚这个特定区块的工作)。 Remus Rusanu一段时间后写了一篇关于这篇文章的文章。
CREATE PROCEDURE xyz [params]
AS
BEGIN
BEGIN TRY
BEGIN TRAN
-- Do the work
COMMIT
END TRY
BEGIN CATCH
DECLARE
@Error int,
@Severity int,
@Message varchar(4000)
SELECT
@Error = ERROR_NUMBER(),
@Severity = ERROR_SEVERITY(),
@Message = ERROR_MESSAGE()
ROLLBACK
RAISERROR('Procedure xyz: %d: %s', @Severity, 1, @Error, @Message)
END CATCH
END
答案 2 :(得分:1)
SQL server sp。
create procedure doStuff
(
@amount int
)
as
begin try
begin transaction
if something
raiserror('not_good', 16, 1)
if somethingelse
raiserror('some_other_thing', 16, 1)
do stuff here
commit
end try
begin catch
if @@trancount > 0
rollback
declare @errmsg nvarchar(4000), @errseverity int
select @errmsg = error_message(), @errseverity = error_severity()
raiserror(@errmsg, @errseverity, 1)
end catch