Mysql while 嵌套 cursor 游标, 数据迁移

CREATE DEFINER=`root`@`%` PROCEDURE `removeAccPartnerSettle`()
BEGIN
	#Routine body goes here...
	declare removeId int(11) default 0;
	# 已经处理数据条目数
	declare cnt int(11) default 0;
	# 内部批次结束标志
	declare done int default 0;
	
	# 转移表数据结构
	declare intoCreated datetime(0);
	declare intoUpdated datetime(0);
	
	# 处理的最大id
	declare splitId int(11);
	# 查询剩余条目数
	declare tmpCnt int(11);
	
	SELECT max(id) INTO splitId FROM acc_partner_settle_copy1 WHERE state = 1 and created <= '2021-01-01';
	
	
	while cnt < 30000 do 
			# 一次处理条目数
			SELECT COUNT(1) INTO tmpCnt FROM acc_partner_settle_copy1 WHERE state = 1 and id <= splitId;
			
			# 游标
			BEGIN
				# 建立游标并且重新给予变量类型
				declare cur cursor for SELECT 
																`id` AS removeId, 
																`created` AS intoCreated, 
																`updated` AS intoUpdatedFROM acc_partner_settle_copy1 
																WHERE state = 1 and id <= splitId LIMIT 0, 3000;
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
				# 开启游标
				OPEN cur;
					# 游标开始循环
					READ_LOOP:LOOP
						# 提取游标值
						FETCH cur INTO removeId,intoCreated,intoUpdated;
						# 游标结束标志, 需要中止游标
						IF done THEN
							LEAVE READ_LOOP;
						END IF;
						
						# =================================== 代码
						SET cnt = cnt + 1;
						
						# 插入新表
						INSERT INTO `acc_partner_settle_new`(`id`, `created`, `updated`) VALUES (removeId, intoCreated, intoUpdated);

						# 删除旧值
						DELETE FROM acc_partner_settle_copy1 WHERE id = removeId;
						
						# =================================== 代码
					END LOOP;
				# 关闭游标
				CLOSE cur;
			END;
			
			# 数据条目数已经不足一个批次了, 修改条件, 跳出循环
			IF tmpCnt < 3000 THEN
				SET cnt = 99999999;
			END IF;
			
			# 重置游标标志
			set done = 0;
  end while;
END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值