首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用signal/resignal处理mysql错误

使用signal/resignal处理mysql错误
EN

Stack Overflow用户
提问于 2014-10-10 22:49:25
回答 2查看 3.2K关注 0票数 0

我想要检查有效的加载类型。如果传入我的过程的加载类型无效,我希望通过SIGNAL抛出一条错误消息。我还希望有一个通用的退出处理程序来处理任何其他意外的错误,它将回滚任何更改。问题是,通用的退出处理程序优先于我的自定义信号,而我得到的只是“遇到SQLException”。除非我删除了通用的退出处理程序,在这种情况下,我会得到'Load type is incorrect‘。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2014-12-23 13:57:08

尝尝这个

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2019-04-24 15:34:14

我会这样做:

代码语言:javascript
复制
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中的异常处理非常糟糕!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26302162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档