mysql 存储过程 游标 示例

前言:为了实现导入遗漏的数据库数据,需要先查出遗漏的数据,用存储过程来循环批量导入,但是由于mysql中没有数组这个类型,做了一个很笨的办法,每次查询都LIMIT 1 ,调补数据再查询,直到查LIMIT 1出来为null。做完之后才知道还有游标这一概念,于是就将代码改进了下,发现游标的写法和我之前用笨方法有点相似之处。请看代码


=======================原先Mysql的存储过程代码==================================


DROP PROCEDURE IF EXISTS contract_Insert;
delimiter //
CREATE PROCEDURE contract_Insert()
  BEGIN
    DECLARE orderGiftId VARCHAR(64);
    DECLARE startDate DATETIME;
    DECLARE endDate DATE;
    DECLARE cno VARCHAR(15);

    SET orderGiftId =
    (SELECT order_gift.id FROM order_gift
      LEFT JOIN `order` ON order_gift.order_id = `order`.id
      LEFT JOIN order_contract ON order_gift.id = order_contract.order_gift_id
    WHERE pay_status=1 AND order_contract.id IS NULL LIMIT 1);

    WHILE (orderGiftId is not null)DO
      SET startDate = (SELECT create_date FROM order_gift WHERE id = orderGiftId);
      SET endDate = date_add(startDate,interval 1 YEAR );
      SET cno = DATE_FORMAT(startDate,'%Y%m%h%d%s');

      INSERT INTO order_contract(
        id, no, type, status, end_date,parent_id, order_gift_id, create_date,del_flag, start_date, remarks,file_path
      )VALUES (REPLACE(UUID(), '-', ''),concat('ZD',cno),'0','0',endDate,'0',orderGiftId, now(),'0',startDate,'SQL补充导入',concat(concat('/userfiles/contract/ZD/',concat('ZD',cno)),'.doc')),
        (REPLACE(UUID(), '-', ''),concat('XS',cno),'1','0',endDate,'0',orderGiftId, now(),'0',startDate,'SQL补充导入',concat(concat('/userfiles/contract/XS/',concat('XS',cno)),'.doc'));
      #获取下一行数据
      SET orderGiftId =
      (SELECT order_gift.id FROM order_gift
        LEFT JOIN `order` ON order_gift.order_id = `order`.id
        LEFT JOIN order_contract ON order_gift.id = order_contract.order_gift_id
      WHERE pay_status=1 AND order_contract.id IS NULL LIMIT 1);

    END WHILE;
  END;
//
CALL contract_Insert();

===============================end===============================================




==========================使用游标的存储过程========================================

DROP PROCEDURE IF EXISTS contract_Insert;
delimiter //
CREATE PROCEDURE contract_Insert()
  BEGIN
    DECLARE stop int default 0;#终止标记
    DECLARE orderGift_id VARCHAR(64);
    DECLARE orderGift_date DATETIME;
    DECLARE endDate DATE;
    DECLARE cno VARCHAR(15);

  #声明游标
    declare orderGift cursor for (SELECT order_gift.id , order_gift.create_date FROM order_gift
      LEFT JOIN `order` ON order_gift.order_id = `order`.id
      LEFT JOIN order_contract ON order_gift.id = order_contract.order_gift_id
    WHERE pay_status=1 AND order_contract.id IS NULL);
  # 声明游标的异常处理,设置一个终止标记
    declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;

    OPEN orderGift;

    #获取数据到变量
    FETCH orderGift INTO orderGift_id, orderGift_date;
    #判断是否终止
    WHILE stop <> 1 DO

      SET endDate = date_add(orderGift_date,interval 1 YEAR );
      SET cno = DATE_FORMAT(orderGift_date,'%Y%m%h%d%s');

      INSERT INTO order_contract(
        id, no, type, status, end_date,parent_id, order_gift_id, create_date,del_flag, start_date, remarks,file_path
      )VALUES (REPLACE(UUID(), '-', ''),concat('ZD',cno),'0','0',endDate,'0',orderGift_id, now(),'0',orderGift_date,'SQL补充导入',concat(concat('/userfiles/contract/ZD/',concat('ZD',cno)),'.doc')),
        (REPLACE(UUID(), '-', ''),concat('XS',cno),'1','0',endDate,'0',orderGift_id, now(),'0',orderGift_date,'SQL补充导入',concat(concat('/userfiles/contract/XS/',concat('XS',cno)),'.doc'));
      #获取下一行数据
      FETCH  orderGift INTO orderGift_id, orderGift_date;
    END WHILE;

    #关闭游标
    CLOSE orderGift;
  END;
//
CALL contract_Insert();

================================end=================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值