为什么这个 MySQL 存储过程似乎没有执行它的退出处理程序?
Why does this MySQL stored procedure not seem to execute its exit handler?
我已阅读有关退出处理程序的文档,并在其他地方的相关 SO 问题 here and here 中找到了有用的代码思路。
然而,调用下面的存储过程似乎可以正常完成,并且 return 参数 success
的值为 TRUE。当我知道它肯定没有完成时,尤其是因为正文中存在语法错误 SQL(它指的是一个不存在的字段)。
所以退出处理程序应该已经启动并且 return 为参数 success
设置了 FALSE。
任何人都可以帮助我理解为什么失败的交易没有 return 正确的参数值吗? (我怀疑这与我将 success
设置为 true 的位置有关)
交易中的实际SQL对这个问题并不重要,所以我没有展示它。只是假设它可能会或可能不会成功完成交易。我想通过参数
来检测那笔交易的成败
DELIMITER $$
CREATE PROCEDURE do_thing (OUT success BOOLEAN)
DETERMINISTIC
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET success := FALSE; ROLLBACK; END; # rollback on any error
DECLARE EXIT HANDLER FOR SQLWARNING BEGIN SET success := FALSE; ROLLBACK; END; # rollback on any warning
START TRANSACTION;
< SQL that might cause an error >
< in my case it was referring to a field that didn't exist>
COMMIT;
SET success := TRUE;
END$$
DELIMITER ;
参见DBFIDDLE
第一部分是您的代码的副本,它会引发错误....
第二部分已更正,两个DECLARE EXIT
都在块内移动。
第三部分是将@success设置为false
的例子。
我已阅读有关退出处理程序的文档,并在其他地方的相关 SO 问题 here and here 中找到了有用的代码思路。
然而,调用下面的存储过程似乎可以正常完成,并且 return 参数 success
的值为 TRUE。当我知道它肯定没有完成时,尤其是因为正文中存在语法错误 SQL(它指的是一个不存在的字段)。
所以退出处理程序应该已经启动并且 return 为参数 success
设置了 FALSE。
任何人都可以帮助我理解为什么失败的交易没有 return 正确的参数值吗? (我怀疑这与我将 success
设置为 true 的位置有关)
交易中的实际SQL对这个问题并不重要,所以我没有展示它。只是假设它可能会或可能不会成功完成交易。我想通过参数
来检测那笔交易的成败DELIMITER $$
CREATE PROCEDURE do_thing (OUT success BOOLEAN)
DETERMINISTIC
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET success := FALSE; ROLLBACK; END; # rollback on any error
DECLARE EXIT HANDLER FOR SQLWARNING BEGIN SET success := FALSE; ROLLBACK; END; # rollback on any warning
START TRANSACTION;
< SQL that might cause an error >
< in my case it was referring to a field that didn't exist>
COMMIT;
SET success := TRUE;
END$$
DELIMITER ;
参见DBFIDDLE
第一部分是您的代码的副本,它会引发错误....
第二部分已更正,两个DECLARE EXIT
都在块内移动。
第三部分是将@success设置为false
的例子。