使用signal / resignal进行mysql错误处理

时间:2014-10-10 14:49:25

标签: mysql exception-handling signals exit

我想检查有效的加载类型。如果传入我的过程的加载类型无效,我想通过SIGNAL抛出一条错误消息。我还希望为任何其他意外错误提供一个通用EXIT处理程序,它将回滚任何更改。问题是通用的EXIT处理程序优先于我的自定义SIGNAL,而我得到的只是遇到了SQLException'。除非我删除了通用的EXIT处理程序,否则我会得到“加载类型不正确”#39;

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;

2 个答案:

答案 0 :(得分:2)

试试这个

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;

答案 1 :(得分:-1)

我要这样做的是:

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,则“退出”处理程序会捕获到该警告),但仍会完全掩盖原因(可能bcoz警告未发出信号,我猜,因此,尽管“辞职”,也没有什么要辞职的,所以也没有辞职的事!最终发生的是:捕获了一个警告(例如,数据截断)并中止了执行, 没有表明发生了这种情况!)

根据我的经验,这就是我所看到的。

从Oracle背景出发,我可以肯定地说MySQL中的异常处理非常糟糕!