我试图发生错误时回滚,但仍然让客户端接收到错误。这实际上可能是不可能的,除非有一种方法可以访问异常处理程序中的错误。
可以从异常中“抛出”,即可以发出信号:
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 文档中的示例代码看起来horrible,因为它字面上吞掉所有错误并将它们合而为一。
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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)