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
分享到:
相关推荐
该存储过程使用游标嵌套来实现数据初始化。 在存储过程中,我们首先定义了多个变量,用于存储用户信息和参数信息。然后,我们使用 WHILE 循环来插入用户数据和参数数据。每次循环,我们使用游标嵌套来插入用户参数...
总结来说,这个示例展示了如何在MySQL存储过程中使用游标进行循环处理,并在循环内部再次嵌套游标以实现更精细的数据操作。这种技术在处理大量数据或执行复杂逻辑时非常有用,尤其是在需要逐行检查和处理数据的情况...
loop 游标双层嵌套循环 创建临时表, 游标
mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。
除了基础的游标操作,MySQL还支持其他特性,如:嵌套游标(一个游标内部使用另一个游标)、可滚动游标(允许向前和向后移动)以及隐式游标(无需显式声明,常在存储过程中使用)。 在实际应用中,游标常常用于以下...
MySQL 从 5.0 版本开始支持存储过程和触发器,而游标在递归树结构中非常有用。游标是 MySQL 中的一种机制,允许开发人员在存储过程和触发器中控制数据的获取和处理。 在 MySQL 中,游标是通过 DECLARE 语句定义的,...
自MySQL 5.0版本开始引入存储过程和触发器,使得数据库功能更加丰富,同时也引入了对游标的有限支持。尽管MySQL的游标使用方式与PL/SQL有所不同,但基本概念相似。 首先,定义游标是创建一个特定的指针,用于在查询...
MySQL存储过程是一种预编译的SQL代码集合,可以在需要...总结来说,这个例子展示了如何在MySQL中创建和使用存储过程,包括事务控制、参数传递、嵌套调用和游标的使用,是学习和理解MySQL存储过程功能的一个很好的实例。
此外,MySQL还支持局部变量和游标,使得在存储过程中处理数据更加灵活。 在性能优化方面,存储过程可以通过缓存执行计划来提升数据库性能。然而,也需要注意过度使用存储过程可能带来的问题,如代码重复、调试困难...
### MySQL存储过程详解 #### 一、引言 在MySQL 5.0版本中,引入了一个重要的新特性——存储过程。这一功能极大地扩展了MySQL的功能性,并为数据库开发者提供了更为强大的工具箱。本文旨在深入探讨MySQL 5.0存储...
MySQL 5.0版本还引入了几个新特性,比如支持嵌套存储过程、游标和事务控制。嵌套存储过程允许在一个过程中调用另一个过程,增加了代码的模块化和复用性。游标则允许在过程内部逐行处理结果集,这对于迭代操作非常...
总的来说,MySQL存储过程中的代码块、条件控制、迭代以及游标和处理器的使用,共同构建了一个强大的数据库编程环境,能够处理复杂的业务逻辑和数据操作。理解并熟练掌握这些概念,对于提升数据库应用的效率和灵活性...
drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure(in my_id int,out my_name... 您可能感兴趣的文章:Mysql存储过程循环内嵌套使用游标示例代码MySQL 存储过程中执行动态SQL语句的方法Mysql存储过
关于MySQL存储过程,还有更多高级特性,如局部变量、游标、异常处理、递归等。在错误处理方面,可以使用`DECLARE HANDLER`来捕获和处理特定的错误情况。存储过程间可以相互调用,通过`CALL`语句嵌套执行。此外,还...
4. **MySQL存储过程** (04 MySQL存储过程.ppt) - 存储过程的定义和用途:解释存储过程是如何预编译的SQL语句集合,可提高性能并简化代码。 - 参数化存储过程:了解如何定义带参数的存储过程,以及如何调用它们。 ...
MySQL数据库支持嵌套事务,然而在实际应用中并不常见,因为它们可能会引发一些意料之外的问题。嵌套事务通常指的是在一个事务内部启动另一个事务,这种用法在某些特定情况下可能是必要的,但大多数时候应避免使用。 ...