因为不知道操作数到底需要几条记录才能处理完,所以使用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得到的值是否相同,相同则跳出循环。