博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql游标嵌套循环
阅读量:4143 次
发布时间:2019-05-25

本文共 4061 字,大约阅读时间需要 13 分钟。

最近在mysql开发过程中用到了游标的嵌套循环,下面列举了3种嵌套循环(loop-loop,loop-while,loop-repeat).
程序用到的表和数据

CREATE TABLE tb_dic_class (

  class_id int(11) DEFAULT NULL,
  class_name varchar(20) DEFAULT NULL,
  createtime datetime DEFAULT 'CURRENT_TIMESTAMP',
  modifytime datetime DEFAULT 'CURRENT_TIMESTAMP'
)
ENGINE = INNODB
AVG_ROW_LENGTH = 5461
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE tb_students (

  id int(11) NOT NULL,
  student_name varchar(30) DEFAULT NULL,
  class_id int(11) DEFAULT NULL,
  createtime datetime DEFAULT 'CURRENT_TIMESTAMP',
  modifytime datetime DEFAULT 'CURRENT_TIMESTAMP',
  PRIMARY KEY (id)
)
ENGINE = INNODB
AVG_ROW_LENGTH = 5461
CHARACTER SET utf8
COLLATE utf8_general_ci;

INSERT INTO tb_dic_class(class_id, class_name, createtime, modifytime) VALUES
(1, '一班', now(), now());
INSERT INTO tb_dic_class(class_id, class_name, createtime, modifytime) VALUES
(2, '二班', now(), now());
INSERT INTO tb_dic_class(class_id, class_name, createtime, modifytime) VALUES
(3, '三班', now(), now());

SET NAMES 'utf8';
INSERT INTO tb_students(id, student_name, class_id, createtime, modifytime) VALUES
(10, '张三', 1, now(), now());
INSERT INTO tb_students(id, student_name, class_id, createtime, modifytime) VALUES
(20, '李四', 1, now(), now());
INSERT INTO tb_students(id, student_name, class_id, createtime, modifytime) VALUES
(30, '王五', 3, now(), now());

1.loop-loop嵌套

CREATE PROCEDURE hxl.sp_loop_loop()

BEGIN
  DECLARE l_class_id int;
  DECLARE l_class_name varchar(20);
  DECLARE l_student_id int;
  DECLARE l_student_name varchar(20);
  DECLARE done int;

  DECLARE cur_out CURSOR FOR

  SELECT
    class_id,class_name
  FROM tb_dic_class;

  DECLARE cur_inner CURSOR FOR

  SELECT
    ID,
    student_name
  FROM tb_students
  WHERE class_id = l_class_id;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur_out;
out_loop:
LOOP
  FETCH cur_out INTO l_class_id,l_class_name;

  IF done = 1 THEN

    LEAVE out_loop;
  END IF;
 
  open cur_inner;
 
  inner_loop:LOOP
    FETCH cur_inner INTO l_student_id,l_student_name;
    IF done = 1 THEN
       LEAVE inner_loop;
     end IF;
     SET @output_string= CONCAT('班级编码:',l_class_id,',班级名称:',l_class_name,',学生编号:',l_student_id,',学生名称:',l_student_name);
     SELECT @output_string;     
  end LOOP inner_loop;
  CLOSE cur_inner;
  SET done=0;

END LOOP out_loop;

  CLOSE cur_out;
END
2.loop-while嵌套

CREATE PROCEDURE sp_loop_while()

BEGIN DECLARE l_class_id     INT;
  DECLARE l_class_name   VARCHAR(20);
  DECLARE l_student_id   INT;
  DECLARE l_student_name VARCHAR(20);
  DECLARE done           INT;

  DECLARE cur_out CURSOR FOR

  SELECT class_id
       , class_name
  FROM
    tb_dic_class;

  DECLARE cur_inner CURSOR FOR

  SELECT ID
       , student_name
  FROM
    tb_students
  WHERE
    class_id = l_class_id;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur_out;

out_loop:

LOOP
FETCH cur_out INTO l_class_id, l_class_name;

  IF done = 1 THEN

    LEAVE out_loop;
  END IF;

  OPEN cur_inner;

 

  SET done = 0; /* 内层循环控制*/
 
  FETCH cur_inner INTO l_student_id, l_student_name;
 
  WHILE done <> 1
  DO

    SET @output_string = concat('班级编码:', l_class_id, ',班级名称:', l_class_name, ',学生编号:', l_student_id, ',学生名称:', l_student_name);

    SELECT @output_string;
    FETCH cur_inner INTO l_student_id, l_student_name;
  END WHILE;

  CLOSE cur_inner;

  SET done = 0; /* 外层循环控制*/

END LOOP out_loop;

  CLOSE cur_out;
END

3.loop-repeat嵌套

CREATE PROCEDURE sp_loop_repeat()

BEGIN DECLARE l_class_id     INT;
  DECLARE l_class_name   VARCHAR(20);
  DECLARE l_student_id   INT;
  DECLARE l_student_name VARCHAR(20);
  DECLARE done           INT;

  DECLARE cur_out CURSOR FOR

  SELECT class_id
       , class_name
  FROM
    tb_dic_class;

  DECLARE cur_inner CURSOR FOR

  SELECT ID
       , student_name
  FROM
    tb_students
  WHERE
    class_id = l_class_id;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur_out;

out_loop:

LOOP
FETCH cur_out INTO l_class_id, l_class_name;

  IF done = 1 THEN

    LEAVE out_loop;
  END IF;

  OPEN cur_inner;

  SET done = 0;

  REPEAT
    FETCH cur_inner INTO l_student_id, l_student_name;
   
    if done <> 1 then
     SET @output_string = concat('班级编码:', l_class_id, ',班级名称:', l_class_name, ',学生编号:', l_student_id, ',学生名称:', l_student_name);
     SELECT @output_string;        
    end if;

  UNTIL done

  END REPEAT;
  CLOSE cur_inner;

  SET done = 0; /* 外层循环控制*/

END LOOP out_loop;

  CLOSE cur_out;
END

转载地址:http://yoyti.baihongyu.com/

你可能感兴趣的文章
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
一篇搞懂Java反射机制
查看>>
Single Number II --出现一次的数(重)
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
Mysql中下划线问题
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>