参考示例: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

posted on 2023-10-19 14:39  邢帅杰  阅读(586)  评论(0编辑  收藏  举报