因为不知道操作数到底需要几条记录才能处理完,所以使用LOOP循环一条一条SELECT记录。判断当SELECT记录为空,或者操作数为0时跳出循环 LEAVE LOOP。 结果只有操作数为0时才能跳出循环,why?
DELIMITER $$ DROP PROCEDURE IF EXISTS test_sp1 $$ CREATE PROCEDURE test_sp1( ) BEGIN DECLARE t_id,t_var, t_num INT; SET t_num = 10; /* t_num 为操作数,实际情况从存储过程外传入 */ START TRANSACTION; loop1: LOOP SELECT `ID`, `var` INTO t_id, t_var FROM `sp_table` LIMIT 1; IF t_var IS NULL OR t_num = 0 THEN /* 只要第一次对t_var赋值成功,以后t_var都是非空的 */ LEAVE loop1; /* 这行只有当t_num = 0时才能执行 */ ELSE UPDATE `sp_table` SET `var` = `var` + 1 WHERE `ID` = t_id; t_num = t_num - 1; END IF; END LOOP loop1; IF @@error_count = 0 THEN COMMIT; ELSE ROLLBACK; END IF; END$$ DELIMITER ;
“SELECT sth INTO variable”这条语句在赋值时,当结果为空,而variable非空,就会保持variable原有的值,所以不能跳出循环。 解决方法:设一个零时变量,记录上一条的主键(唯一),判断和这次select得到的值是否相同,相同则跳出循环。

最新评论