参考示例:https://blog.csdn.net/xw1680/article/details/130119856
DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_cursor_test3` $$ CREATE PROCEDURE `sp_cursor_test3`() top:BEGIN -- 错误标记,当sql执行出错的时候,设置标记等于1。 DECLARE _err INT DEFAULT 0; DECLARE fname LONGTEXT DEFAULT ''; DECLARE msg LONGTEXT DEFAULT ''; -- 定义局部变量:判断是否完成和数量 DECLARE done BOOLEAN DEFAULT 0; -- 定义游标1 DECLARE cs1 CURSOR FOR SELECT CONCAT(first_name,'1') FROM stu; -- 定义游标2 DECLARE cs2 CURSOR FOR SELECT CONCAT(first_name,'2') FROM stu; -- 当fetch游标到了数据库表格最后一行的时候,设置done=1。 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; -- 错误标记处理,放到最后再声明,要放到游标后面。 -- 不然会报错:Variable or condition declaration after cursor or handler declaration DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set _err=1; -- 在开始循环之前修改数据,循环会使用新数据。 -- UPDATE stu SET first_name=DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s') WHERE id=1; -- 打开游标 OPEN cs1; -- 每开始一个循环,重置循环结束标记。 SET done = 0; -- LOOP循环标记 read_loop: LOOP -- FETCH 游标中的列必须要和INTO的列数量和类型一致。 -- 如果游标中没有新的可用行,即Fetch到空行,则会触发NOT FOUND异常,就会把done设置为1。 FETCH cs1 INTO fname; -- 执行逻辑前必须要判断标记,否则会多出一次循环。 IF(done = 0) THEN -- 处理FETCH到的数据 SET msg = CONCAT(msg,fname,'/'); ELSE -- 关闭游标 CLOSE cs1; -- 跳出循环标记 LEAVE read_loop; END IF; -- 结束标记,在循环体中判断并跳出。 END LOOP; -- 关闭游标 CLOSE cs1; -- 游标2 OPEN cs2; SET done = 0; -- REPEAT循环 REPEAT -- FETCH 游标中的列必须要和INTO的列数量和类型一致。 -- 如果游标中没有新的可用行,即Fetch到空行,则会触发NOT FOUND异常,就会把done设置为1。 FETCH cs2 INTO fname; -- 执行逻辑前必须要判断标记,否则会多出一次循环。 IF(done = 0) THEN SET msg = CONCAT(msg,fname,'/'); END IF; -- 通过判断done来结束循环 UNTIL done END REPEAT; -- 关闭游标 CLOSE cs2; SELECT msg; END $$ DELIMITER ;
LEAVE跳出整个存储过程:在第四行为整个存储过程打个标记:top,执行LEAVE top;即可以跳出整个存储过程。
WHILE循环:
DROP PROCEDURE test_while; DELIMITER %% CREATE PROCEDURE test_while(OUT num INT) BEGIN DECLARE i,s INT DEFAULT 0; while_label: WHILE i <= 50 DO SET s = s + i; SET i = i + 1; END WHILE while_label; SET num = s; END %% DELIMITER ; CALL test_while(@x); SELECT @x;
跳转语句之ITERATE语句
ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为 continue,意思为 再次循环。 语句基本格式如下:
ITERATE label