MySQL存储过程中的三种循环方式
最近存储过程写得多,循环多数用在游标里,在这里总结几种循环的方式CREATE DEFINER=`root`@`localhost` PROCEDURE `yizuotu.net`()
BEGIN
DECLARE startDate VARCHAR(20);
DECLARE endDate VARCHAR(20);
declare i int;
declare j int;
set i=0;
set j=0;
#定义开始时间
set startDate = '20180829';
#定义结束时间
set endDate = "20180831";
-- 第一种,while循环
while i < 3 do
select i;
-- i+1
set i = i +1;
end while;
-- 第二种,repeat循环
REPEAT
select j;
set j = j +1;
UNTIL j > 3
END REPEAT;
-- 第三种,loop循环
test_loop: LOOP
select startDate;
#开始时间加一天
set startDate = DATE_FORMAT(date_add(startDate,interval 1 day),"%Y%m%d");
IF startDate>endDate THEN
LEAVE test_loop;
END IF;
END LOOP test_loop;
END
再来看下,在游标中如何使用循环:
CREATE DEFINER=`root`@`localhost` PROCEDURE `yizuotu.net`()
BEGIN
#定义变量用于存储查询结果
declare temp_id varchar(30);
#这个用于处理游标到达最后一行的情况
DECLARE done INT DEFAULT 0;
#声明游标cursor_name(cursor_name是个多行结果集)
DECLARE cursor_three CURSOR FOR
SELECT
id
FROM
test_id;
#设置一个终止标记(如果不要这句,会出现1329 - No data - zero rows fetched, selected, or processed错误信息)
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
#打开游标
OPEN cursor_three;
#开始循环,判断是否游标已经到达了最后作为循环条件
REPEAT
#获取游标当前指针的记录,读取一行数据并传给变量a,b
fetch cursor_three into temp_id;
#输出查出来的ID
select temp_id;
UNTIL done
END REPEAT;
#关闭游标
CLOSE cursor_three ;
END