显然我不能将GET DIAGNOSTICS和ROLLBACK语句组合在一个存储过程中:除了捕获错误之外,我希望能够反转所有以前处理过的数据,而不仅仅是停止执行。请在下面找到我的剧本:
CREATE TABLE tbl_logs ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `txt` VARCHAR(100) NOT NULL, PRIMARY KEY (`id`));
DELIMITER $$ CREATE PROCEDURE `test`() BEGIN DECLARE state CHAR(5) DEFAULT ’00000′; DECLARE msg TEXT; DECLARE EXIT HANDLER FOR SQLEXCEPTION begin rollback; GET DIAGNOSTICS CONDITION 1 state = RETURNED_SQLSTATE, msg = MESSAGE_TEXT; insert into tbl_logs (txt) select concat(‘Error ‘,state,’: ‘,msg); end; start transaction; insert into tbl_logs (txt) select state; – drop table no_such_table; insert into tbl_logs (txt) select ‘commit’; commit; END
call test(); select * from tbl_logs;
=>检查表:2行
00000
提交
修改程序:
取出评论,使下拉表可见。
call test(); select * from tbl_logs;
=>检查表:2个新行而不是一个,最后一个
00000
错误42S02:未知表'no_such_table'
=>处理程序捕获错误并停止执行,只是不考虑回滚(无论以前做什么/其他DML,它们都被提交)...
我做错了什么?