我已经阅读了有关退出处理程序的文档,并在相关的SO问题here和here等其他地方找到了有用的代码思想。
尽管如此,调用下面的存储过程似乎完成了OK,并为参数success
返回TRUE值。当我知道它肯定没有完成时,尤其是因为主体SQL中存在语法错误(它所指的是不存在的字段)。
因此退出处理程序应该已经启动,并且对于参数success
返回FALSE。
任何人都可以帮助我了解为什么失败的事务未返回正确的参数值吗? (我怀疑这与我将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 ;
我已经阅读了有关退出处理程序的文档,并在此处和此处的其他地方的相关SO问题中找到了有用的代码思想。但是,将出现以下调用存储过程的情况...
请参阅DBFIDDLE
第一部分是代码的副本,它引发错误。...