mysql 多重游标嵌套

1、DECLARE CONTINUE HANDLER FOR NOT FOUND

在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND

它的含义是:若没有数据返回,程序继续,并将变量IS_FOUND设为0 ,这种情况是出现在select XX into XXX from tablename的时候发生的。

2、查询每个年级下都有哪些班级,一张年级表(org_grade)一张班级表(org_class)

2.1 建表

CREATE TABLE erp.org_grade (
  grade_Id int(11) NOT NULL AUTO_INCREMENT,
  grade_name varchar(255) DEFAULT NULL,
  PRIMARY KEY (grade_Id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 2
AVG_ROW_LENGTH = 20
CHARACTER SET utf8
COLLATE utf8_general_ci;

CREATE TABLE erp.org_class (
  class_Id int(11) NOT NULL AUTO_INCREMENT,
  class_name varchar(255) DEFAULT NULL,
  grade_id int(11) DEFAULT NULL,
  PRIMARY KEY (class_Id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 3
AVG_ROW_LENGTH = 20
CHARACTER SET utf8
COLLATE utf8_general_ci;

2.2过程示例

CREATE   PROCEDURE good_nested_cursors1(  )
   READS SQL DATA
BEGIN
  DECLARE l_grade_id INT;
  DECLARE l_class_id   INT;
  DECLARE l_class_cnt     INT DEFAULT 0 ;
  DECLARE l_done          INT DEFAULT  0;
 
  DECLARE grade_csr cursor  FOR    SELECT grade_id FROM org_grade;
  DECLARE class_csr cursor  FOR     SELECT class_id FROM org_class  WHERE grade_id=l_grade_id;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_done=1;
  OPEN grade_csr;
  grade_loop: LOOP   -- Loop through org_grade
    FETCH grade_csr into l_grade_id;
                select concat(‘年级:‘, l_grade_id);
    IF l_done=1 THEN
       LEAVE grade_loop;
    END IF;
    OPEN class_csr;
    SET l_class_cnt=0;
    class_loop: LOOP      -- Loop through class in grade.
      FETCH class_csr INTO l_class_id;
      IF l_done=1 THEN
         LEAVE class_loop;
      END IF;
      SET l_class_cnt=l_class_cnt+1;
      select concat(‘    班级:‘, l_class_id);
    END LOOP class_loop;
    CLOSE class_csr;
    SET l_done=0;
 
  END LOOP grade_loop;
  CLOSE grade_csr;
END;

时间: 2024-10-26 00:47:00

mysql 多重游标嵌套的相关文章

mysql中游标在存储过程中的详细用法

昨天写的一个东东,分享下给大家. drop PROCEDURE  if exists sp_cleanUserData; CREATE  PROCEDURE `sp_cleanUserData`() BEGIN /*定义游标*/ declare v_dt bigint(20) default 0 ; declare v_num INT DEFAULT 0; /*游标循环到末尾时给定义的常量赋值*/ declare cur_userId   CURSOR FOR select  userId fr

多重和嵌套if

多重if实例: 看例子,内容不解释了! 隐藏行号 复制代码 ? 多重if import java.util.Scanner; public class 多重if{ public static void main(String[] args){ Scanner input= new Scanner(System.in); System.out.print("请输入成绩"); int i=input.nextInt(); if(i>=90){ System.out.print(&qu

MySQL中游标使用以及读取文本数据

前言 之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课.当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试过了.现在学习大数据分析,接触了数据挖掘,才感觉到数据库是不可跨越的坎.直到现在才感觉到<操作系统>.<编译原理>.<计算机组成原理>等等课程的重要性.在浩瀚的知识面前,个人是非常渺小的.掌握了一种思想之后,任何事情都不困难,困难的是你是否真的静下心看一看帮助文档.认真的Google.静心.静气.认真.执着. 游标-

MySQL通过游标来实现通过查询结果集循环

/*我们有时候会遇到需要对 从A表查询的结果集S_S 的记录 进行遍历并做一些操作(如插入),且这些操作需要的数据或许部分来自S_S集合*//*临时存储过程,没办法,不能直接在查询窗口做这些事.*/drop procedure if exists proc_tmp; create procedure proc_tmp() BEGIN/*这种写法也可以:DECLARE done INT DEFAULT FALSE;*/ declare done int default 0; /*用于判断是否结束循

mysql 使用游标进行删除操作的存储过程

BEGIN DECLARE  hprocessInstanceId bigint DEFAULT 0; -- 历史流程实例id DECLARE  hprocessInstanceIdStarttime CHAR default '';  -- 历史流程实例启动时间 DECLARE  hprocessInstanceIdEndtime CHAR default '';  -- 历史流程实例结束时间 DECLARE  hactinstId BIGINT default 0;  -- 历史活动实例id

用 Navicat 写mysql的游标

千言万语也比不上一个简单直接明了的小例子: CREATE PROCEDURE pro_users() begin DECLARE myid int; DECLARE no int; DECLARE mysellerid char(10); DECLARE mylink char(50); DECLARE myip char(50); DECLARE mycursor CURSOR FOR select id from table1; #把select出来的数据全部保存到游标mycursor中 D

MySql 中游标,事务,终止存储过程方法总结

最近在项目开发中,有段逻辑处理,需要在网站,app,后台分别运行,这样给后期的维护带来了很大的不方便,容易遗漏app端或者后台,所以讲java代码转换成存储过程,把逻辑处理写在了mysql端,其中遇到游标,事务的处理.问题并不困难,只是容易忘记,做了一下总结: DECLARE err INT DEFAULT 0;#声明一个整形变量err,默认值是0 DECLARE orderDone INT DEFAULT FALSE;-- 遍历游标结束标识 DECLARE cur_order CURSOR F

MySQL 存储过程/游标/触发器/事务

来源:http://www.cnblogs.com/zhuyp1015/p/3575823.html 将会用到的几个表 mysql> DESC products; +------------+--------------+------+-----+---------+----------------+| Field      | Type         | Null | Key | Default | Extra          |+------------+--------------+-

MySql使用游标Cursor循环(While)更新数据

#要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECLARE var_WhileTimes INT; #定义游标 DECLARE var_Cur CURSOR FOR SELECT id FROM table_Name; #打开游标 OPEN var_Cur; #将游标的数据进行赋值 FETCH var_Cur INTO var_ID; #获取循环次数