昨天要mysql中写存储过程发现网上有关于cursor循环且套的资料很少,现在 发出本人写的例子,希望能对大家有帮助.[斜体字 必须出现]
DELIMITER $$
USE `db`$$
DROP PROCEDURE IF EXISTS `test`$$
CREATE DEFINER=`root`@`%` PROCEDURE `test`()
BEGIN
DECLARE _tmpId1 INT;
DECLARE _tmpId2 VARCHAR(5000);
DECLARE not_found INT DEFAULT 0 ;-- 是否未找到数据 标记
DECLARE cursor1 CURSOR FOR SELECT id FROM fhtest2 ; -- 测试用无业务关系
DECLARE cursor2 CURSOR FOR SELECT test FROM fhtest2 ;-- 测试用无业务关系
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1; -- 如果未找到数据 将标记改为不可用
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; -- 异常跳出
START TRANSACTION; -- 启动事物
INSERT INTO fhtest2 (test) VALUES (' 开始1 ');
INSERT INTO fhtest2 (test) VALUES (' 开始2 ');
OPEN cursor1; -- 启动游标1
WHILE not_found = 0 DO -- 必须加上 不然只执行一次
FETCH cursor1 INTO _tmpId1;-- 获取数据
IF NOT not_found THEN --必须加上 不然执行一次
-- 业务处理
OPEN cursor2; -- 启动游标2 去掉红色部分就是单循环
WHILE not_found = 0 DO
FETCH cursor2 INTO _tmpId2;-- 获取数据
IF NOT not_found THEN
INSERT INTO fhtest2 (test) VALUES (CONCAT(' id + test= ',_tmpId1,_tmpId2)); -- 业务处理
END IF ;
END WHILE ;
CLOSE cursor2;
SET not_found = 0 ; -- 将 标记改为0即可用 否则只执行一次,以为内部循环执行完成后 not_found = 1,所有要将其置为0
END IF;
END WHILE;
CLOSE cursor1;
COMMIT;
END$$
DELIMITER ;