dje*_*lin 7 mysql signals exception-handling
我正在尝试回滚错误,但仍然让客户端收到错误.除非有一种方法可以在异常处理程序中访问错误,否则这实际上可能是不可能的.
可以从异常中"抛出",即可以发出信号:
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;
Run Code Online (Sandbox Code Playgroud)
但是这个来自MySQL doc的示例代码看起来很糟糕,因为它实际上吞噬了所有错误并将它们合并为一个.
SHOW ERRORS似乎相关,但我没有看到任何方式以编程方式使用它,例如SELECT Code FROM (SHOW ERRORS);是不可能的.
这可能吗?有没有更好的做法,我完全错过了?
看起来就像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>
Run Code Online (Sandbox Code Playgroud)