MYSQL 游标使用.避免插入duplicate 重复数据

这是一个关于数据库存储过程的示例,主要用于处理超过90天的订单数据。过程首先创建一个临时表,然后从`order_status`表中选取状态为'10'且订单时间超过90天的订单号,并限制只插入一条记录。接下来,声明游标并遍历临时表,将符合条件的订单号插入到`TMP_Over_90_days_order`表中。整个过程涉及到了数据库的表操作、条件筛选和游标的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE DEFINER=`root`@`%` PROCEDURE `Process_Over_Days_Orders`()
BEGIN
	#Routine body goes here...
	BEGIN
		DROP TABLE IF EXISTS test_table;
		CREATE  TEMPORARY TABLE IF NOT EXISTS test_table( `order_no` varchar(30));

		Insert into test_table
		Select order_no from order_status
		where 
			TIMESTAMPDIFF(DAY, order_time, modified ) >= 90
			and order_status = '10'
-- 			and order_no Not in (
-- 				 Select order_no from TMP_Over_90_days_order
-- 			)
		limit 1;
	END;
	
	BEGIN
	
		DECLARE cid BIGINT;
		DECLARE vDone INT;
		DECLARE cur CURSOR for 	
			  Select order_no as cid from  test_table;
		DECLARE CONTINUE HANDLER for not FOUND set vDone=1;
		
-- 		open cur;		
-- 				posLoop:LOOP
-- 					IF done=1 THEN
-- 							LEAVE posLoop; 						
-- 					END IF;	
 ## 错误写法, 或造成最后一条数据, 重复插入2次	
-- 					
-- 					FETCH cur INTO cid;				
-- 					Insert into TMP_Over_90_days_order (order_no) Values (cid);	
-- 				
-- 				END LOOP posLoop;
-- 				
-- 		CLOSE cur;
-- 	
	
-- ok		
		open cur;		
				posLoop:LOOP
					FETCH cur INTO cid;		
							
					IF vDone=1 THEN
							LEAVE posLoop;
					ELSE 					
						Insert into TMP_Over_90_days_order (order_no) Values (cid);		
					END IF;		
				END LOOP posLoop;
				
		CLOSE cur;
-- ok
		open cur;		
				posLoop:LOOP
				
        FETCH cur INTO cid;				
					IF vDone=1 THEN
							LEAVE posLoop;				
					END IF;					
					Insert into TMP_Over_90_days_order (order_no) Values (cid);	
				
				END LOOP posLoop;
				
		CLOSE cur;
		
   END;
	 
	 

	
	


END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值