mysql存储过程 例子 游标cursor 循环嵌套 事物

昨天要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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值