1.双循环
CREATE DEFINER=`root`@`%` PROCEDURE `procedure1`( )
BEGIN
-- 声明变量
declare done INT DEFAULT 0;
declare edone INT DEFAULT 0;
-- 接受游标查询结果
DECLARE var_1 VARCHAR ( 20 ) ;
DECLARE var_2 VARCHAR ( 20 ) ;
DECLARE var_3 INT ( 10 );
-- 标识事务错误
DECLARE err INT DEFAULT 0;
-- 定义游标接受查询结果
declare cur1 CURSOR FOR SELECT column1 FROM tabel1;
-- 结束标识
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 打开游标
OPEN cur1;
-- 开始循环
loop_a:LOOP
-- 读取游标数据到参数列表
FETCH cur1 into var_1 ;
if done=1 then leave loop_a; end if;
-- !!!!!重置标识
SET edone = 0;
BEGIN
-- 定义游标以及结束标识
DECLARE cur2 CURSOR FOR
SELECT colum2, column3 FROM table2 t GROUP BY citynum;
-- 结束标识
DECLARE CONTINUE HANDLER FOR NOT FOUND SET edone = 1;
OPEN cur2 ;-- 打开游标
innerloop:LOOP -- 循环游标开始
FETCH cur2 INTO var_2,var_3;
IF edone = 1 THEN LEAVE innerloop;
ELSE
IF err=1 THEN ROLLBACK;
ELSE
-- 对表的操作
INSERT INTO table3 (column4,column5,column6)
VALUES ( var_1, var_2, var_3);
END IF;
END IF;
END LOOP;
-- 关闭游标
CLOSE cur2;
END;
END LOOP loop_a;
CLOSE cur1;
END
2.单循环
CREATE DEFINER=`root`@`%` PROCEDURE `procedure2`( )
BEGIN
-- 声明变量
DECLARE s int DEFAULT 0;
-- 接受游标查询结果
DECLARE var_1 VARCHAR ( 6 ) ;
DECLARE var_2 VARCHAR ( 30 ) ;
-- 定义游标接受查询结果
DECLARE cur1 CURSOR FOR SELECT column1 ,column2 FROM table1;
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
OPEN cur1;
-- 读取游标数据到参数列表
FETCH cur1 into var_1 , var_2;
while s<>1 do
UPDATE table2 SET column3 = var_2 WHERE column4 = var_1 ;
-- 将游标中的值再赋值给变量,供下次循环使用
FETCH cur1 into var_1 ,var_2;
-- 当s等于1时表明遍历以完成,退出循环
end while;
CLOSE cur1;
END