`
ytfei
  • 浏览: 89379 次
社区版块
存档分类
最新评论

mysql 存储过程 游标嵌套

阅读更多

CREATE TABLE `org_grade` (
  `grade_id` int(11) NOT NULL,
  PRIMARY KEY (`grade_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

CREATE TABLE `org_class` (
  `class_id` int(11) NOT NULL,
  `grade_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`class_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

insert into org_grade values(1),(2),(3);

insert into org_class  values (1,1),(2,1),(3,1),(4,2),(5,2),(6,3),(7,3),(8,3);

 

 

delimiter //
drop procedure if exists good_nested_cursors1
//
CREATE   PROCEDURE good_nested_cursors1()
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;
               
    IF l_done=1 THEN
       LEAVE grade_loop;
    END IF;
 
 select concat('grade:', l_grade_id);

    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(concat('grade:',l_grade_id),concat(' class:', l_class_id));
    END LOOP;
    CLOSE class_csr;
    SET l_done=0;
 END LOOP grade_loop;
  CLOSE grade_csr;
END;
//
delimiter ;

 

 

 

注意:

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; (游标取不到下一条记录时 done=1)

DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_done=1; (查询不到结果时 l_done=1)

这两条语句的作用域分别是声明处的 block (一对begin,end算一个block) 。 如果block中的语句触发了这个handler ,记得重置该值(上例)。或者如下例,采用独立的BLOCK 声明独立的 handler;

--------------------------------------------------------------------

 

delimiter //
drop procedure if exists test1//
create procedure test1()
  begin   
        declare done int default 0;
        declare v_order_id int(11);       
        declare v_tagr_id int(11);   
       
            block1:begin
            declare cur1 cursor for select order_id from tbl_order where date_add(add_time,interval 2 day)<now();   
            declare cur2 cursor for select tag_id from tbl_tags_record limit 2;           
            DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
            open cur1;
            loop1:loop
            fetch cur1 into v_order_id;               
            if done then
                close cur1;
                leave loop1;
            end if;   
            select concat('out1:',v_order_id);
            block2:begin
           
            DECLARE done2 int default 0;
            DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done2 = 1;
            open cur2;
            loop2:loop
            fetch cur2 into v_tagr_id;               
            if done2 then
                close cur2;
                leave loop2;
            end if;       
            select concat('in1:',v_tagr_id);
            end loop loop2;
            end block2;   
           
           
            end loop loop1;       
            end block1;
  end
 //
 delimiter ;

 

参考资料:http://bbs.chinaunix.net/viewthread.php?tid=772236

http://school.cnd8.com/mysql/jiaocheng/34969.htm

http://hideto.iteye.com/blog/195275

http://xp19830105.iteye.com/blog/667974

http://godzwj.iteye.com/blog/398707

分享到:
评论

相关推荐

    mysql游标嵌套[文].pdf

    该存储过程使用游标嵌套来实现数据初始化。 在存储过程中,我们首先定义了多个变量,用于存储用户信息和参数信息。然后,我们使用 WHILE 循环来插入用户数据和参数数据。每次循环,我们使用游标嵌套来插入用户参数...

    Mysql存储过程循环内嵌套使用游标示例代码

    总结来说,这个示例展示了如何在MySQL存储过程中使用游标进行循环处理,并在循环内部再次嵌套游标以实现更精细的数据操作。这种技术在处理大量数据或执行复杂逻辑时非常有用,尤其是在需要逐行检查和处理数据的情况...

    mysql存储过程双层嵌套

    loop 游标双层嵌套循环 创建临时表, 游标

    mysql 多个游标依次执行

    mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。

    mysql游标

    除了基础的游标操作,MySQL还支持其他特性,如:嵌套游标(一个游标内部使用另一个游标)、可滚动游标(允许向前和向后移动)以及隐式游标(无需显式声明,常在存储过程中使用)。 在实际应用中,游标常常用于以下...

    mysql游标详解

    MySQL 从 5.0 版本开始支持存储过程和触发器,而游标在递归树结构中非常有用。游标是 MySQL 中的一种机制,允许开发人员在存储过程和触发器中控制数据的获取和处理。 在 MySQL 中,游标是通过 DECLARE 语句定义的,...

    Mysql的游标的定义使用及关闭深入分析

    自MySQL 5.0版本开始引入存储过程和触发器,使得数据库功能更加丰富,同时也引入了对游标的有限支持。尽管MySQL的游标使用方式与PL/SQL有所不同,但基本概念相似。 首先,定义游标是创建一个特定的指针,用于在查询...

    MySQL存储过程例子(包含事务,输出参数,嵌套调用)

    MySQL存储过程是一种预编译的SQL代码集合,可以在需要...总结来说,这个例子展示了如何在MySQL中创建和使用存储过程,包括事务控制、参数传递、嵌套调用和游标的使用,是学习和理解MySQL存储过程功能的一个很好的实例。

    中文版MySQL5之存储过程技术手册

    此外,MySQL还支持局部变量和游标,使得在存储过程中处理数据更加灵活。 在性能优化方面,存储过程可以通过缓存执行计划来提升数据库性能。然而,也需要注意过度使用存储过程可能带来的问题,如代码重复、调试困难...

    MySQL 5.0存储过程

    MySQL 5.0版本还引入了几个新特性,比如支持嵌套存储过程、游标和事务控制。嵌套存储过程允许在一个过程中调用另一个过程,增加了代码的模块化和复用性。游标则允许在过程内部逐行处理结果集,这对于迭代操作非常...

    mysql存储过程之代码块条件控制迭代.docx

    总的来说,MySQL存储过程中的代码块、条件控制、迭代以及游标和处理器的使用,共同构建了一个强大的数据库编程环境,能够处理复杂的业务逻辑和数据操作。理解并熟练掌握这些概念,对于提升数据库应用的效率和灵活性...

    mysql 存储过程输入输出参数示例

    drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure(in my_id int,out my_name... 您可能感兴趣的文章:Mysql存储过程循环内嵌套使用游标示例代码MySQL 存储过程中执行动态SQL语句的方法Mysql存储过

    MySQL 有输入输出参数的存储过程实例

    关于MySQL存储过程,还有更多高级特性,如局部变量、游标、异常处理、递归等。在错误处理方面,可以使用`DECLARE HANDLER`来捕获和处理特定的错误情况。存储过程间可以相互调用,通过`CALL`语句嵌套执行。此外,还...

    mysql 面试题.zip

    4. **MySQL存储过程** (04 MySQL存储过程.ppt) - 存储过程的定义和用途:解释存储过程是如何预编译的SQL语句集合,可提高性能并简化代码。 - 参数化存储过程:了解如何定义带参数的存储过程,以及如何调用它们。 ...

    MySQL嵌套事务所遇到的问题

    MySQL数据库支持嵌套事务,然而在实际应用中并不常见,因为它们可能会引发一些意料之外的问题。嵌套事务通常指的是在一个事务内部启动另一个事务,这种用法在某些特定情况下可能是必要的,但大多数时候应避免使用。 ...

Global site tag (gtag.js) - Google Analytics