【问题标题】:MySQL exception handler access exception being handledMySQL异常处理程序访问异常正在处理
【发布时间】:2013-09-22 09:45:00
【问题描述】:

我正在尝试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); 是不可能的。

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

【问题讨论】:

    标签: mysql exception-handling signals


    【解决方案1】:

    看起来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>
    

    【讨论】:

    • 谢谢。我不知道为什么不会在 SIGNAL 或 DECLARE HANDLER 文档中指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2021-06-29
    • 2011-12-12
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多