正在处理MySQL异常处理程序访问异常

时间:2013-09-17 19:43:58

标签: mysql exception-handling signals

我正在尝试rollback on an error, but still let the client receive the error。除非有办法在异常处理程序中访问错误,否则这实际上可能是不可能的。

可以从异常中“抛出”,即可以raise a signal

CREATE PROCEDURE p ()
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    SIGNAL SQLSTATE VALUE '99999'
      SET MESSAGE_TEXT = 'An error occurred';
  END;
  DROP TABLE no_such_table;
END;

但是这个来自MySQL文档的示例代码看起来很糟糕,因为它实际上吞下所有错误并将它们合并为一个。

SHOW ERRORS似乎相关,但我认为没有办法以编程方式使用它,例如SELECT Code FROM (SHOW ERRORS);是不可能的。

这可能吗?有没有更好的做法,我完全错过了?

1 个答案:

答案 0 :(得分:7)

看起来RESIGNAL正是您要找的。

  

RESIGNAL可以处理错误并返回错误信息。否则,通过在处理程序中执行SQL语句,会导致导致处理程序激活的信息被破坏。如果给定的处理程序可以处理部分情况,RESIGNAL也可以缩短某些过程,然后将条件“上线”传递给另一个处理程序。

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`resig` $$
CREATE PROCEDURE `test`.`resig` ()
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
  SELECT 'I executed something before throwing the error' as `this_works`;
  RESIGNAL;
END;

SELECT foo FROM bar WHERE baz = 0;

END $$

DELIMITER ;


mysql> call resig();
+------------------------------------------------+
| this_works                                     |
+------------------------------------------------+
| I executed something before throwing the error |
+------------------------------------------------+
1 row in set (0.00 sec)

ERROR 1054 (42S22): Unknown column 'foo' in 'field list'

mysql>