我想要检查有效的加载类型。如果传入我的过程的加载类型无效,我希望通过SIGNAL抛出一条错误消息。我还希望有一个通用的退出处理程序来处理任何其他意外的错误,它将回滚任何更改。问题是,通用的退出处理程序优先于我的自定义信号,而我得到的只是“遇到SQLException”。除非我删除了通用的退出处理程序,在这种情况下,我会得到'Load type is incorrect‘。
code:
DECLARE incorrect_load_type CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR incorrect_load_type
RESIGNAL SET MESSAGE_TEXT = 'Load type is incorrect';
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
begin
SELECT 'SQLException encountered';
rollback;
end;
IF(v_load_type != 'CORRECT TYPE') THEN
SIGNAL incorrect_load_type;
END IF;发布于 2014-12-23 13:57:08
尝尝这个
DECLARE incorrect_load_type CONDITION FOR SQLSTATE '22012';
DECLARE EXIT HANDLER FOR incorrect_load_type
begin
SELECT 'Load type is incorrect';
end;
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
begin
SELECT 'SQLException encountered';
rollback;
end;
IF (v_load_type != 'CORRECT TYPE') THEN
SIGNAL incorrect_load_type;
END IF;发布于 2019-04-24 15:34:14
我会这样做:
DECLARE custom_exception CONDITION FOR SQLSTATE '45000';
DECLARE EXIT HANDLER FOR SQLEXCEPTION begin
rollback;
resignal;
end;
IF v_load_type != 'CORRECT TYPE' THEN
SIGNAL custom_exception set message_text = 'Load type is incorrect';
END IF;注意,我已经创建了一个通用的自定义异常,并在发出信号时设置消息文本。这允许通用SQLEXCEPTION退出处理程序捕获它并传播该错误消息。
接下来,我删除了自定义异常的处理程序。
最后,我从退出处理程序中删除了SQLWARNING。这是为了避免捕获无伤大雅的警告,从而终止执行(因为如果包含SQLWARNING,"exit“处理程序就会捕捉到它),但却完全掩盖了原因(我猜很可能是bcoz警告没有发出信号)。因此,尽管有“重发信号”,没有什么可以重发信号,所以没有什么是辞职的!而最终发生的是:一个警告(例如,数据截断)被捕获并且执行中止,并且没有发生这种情况的迹象!)
这似乎是我从我的经验中看到的。
来自Oracle的背景,我可以肯定地说,MySQL中的异常处理非常糟糕!
https://stackoverflow.com/questions/26302162
复制相似问题