gpt4 book ai didi

sql - 存储过程中的多重错误处理

转载 作者:行者123 更新时间:2023-12-04 21:13:05 25 4
gpt4 key购买 nike

我想知道是否有人可以指出正确的方向。这是我第一次尝试在 SQL 中进行任何类型的错误处理,恐怕我完全遗漏了一些东西,或者误解了错误处理的概念。

我有一个过程,它基本上接受 3 个值,然后尝试查看其中一个值是否存在。如果是,则执行更新语句。

基本上,我想做以下事情:- 如果没有遇到错误,则返回“1”- 如果 Select 语句找不到记录则返回错误- 如果 Update 语句未能更新任何记录,则返回错误

下面是我的程序。目前,每当我运行它时,它都会返回一个“1”,表示没有错误,这不是我预期的工作方式,因为我正在传递虚假值并试图破坏它。有人可以帮助指出我做错了什么,或者这是否可能?

alter PROCEDURE [dbo].prc_update_SPRO_refill_status                             
@result_code char(2),
@result_string char(10),
@rx_id char(20)


AS
BEGIN


SET NOCOUNT ON;
BEGIN TRANSACTION
BEGIN TRY

DECLARE @prescription_orders_id varchar(20)
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;

IF @result_code = 0
BEGIN
SELECT @prescription_orders_id = prescription_orders_id
FROM prescription_orders
WHERE rx_external_id = @rx_id
-- Return error if record not found

UPDATE prescription_orders_fills
SET fill_status_code = 'R'
WHERE prescription_orders_id = @prescription_orders_id
AND fill_status_code = 'P'
AND fill_number > 1
-- return error if record not found
-- return error if more then 1 record update


END
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRANSACTION
SELECT 1 as ERROR_NUMBER
END
END

最佳答案

我认为这里的问题非常简单:您期望 TRY 失败并在未引发异常时将您撞到 CATCH block 。想一想:以下查询是否仅仅因为没有更新行而引发错误?

CREATE TABLE #foo(a INT);

UPDATE #foo SET a = 1 WHERE a = 2;

这里没有错误信息,所以没有理由触发CATCH。如果您想测试您的错误处理,请在其中放置一个真实 错误条件。例如:

BEGIN TRY
IF @force_error = 1
BEGIN
SELECT 1/0;
END
END TRY
BEGIN CATCH
-- now you should get here...
END CATCH

另外正如我在评论中提到的那样 - 使用 RETURN 将错误号/状态代码发送回调用者。没有理由调用记录集返回单个标量值所需的所有脚手架。

关于sql - 存储过程中的多重错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156520/

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