MySQL游标实例

需求:
某些店铺当天没有交易,所以日结表中之前未给其生成一条空数据,本存储过程将给每一个店铺在没有交易的日子里向日结表中初始化一条空数据;
店铺不多,所以不太需要考虑效率,功能实现即可;

delimiter $$ # 声明结束标签
-- 创建存储过程
drop procedure if exists initSaleMethod;
create procedure initSaleMethod() # 创建存储过程
BEGIN 
DECLARE shopId VARCHAR (32); # 店铺编号
DECLARE createTime DATETIME; # 店铺创建时间
DECLARE nowDate DATETIME DEFAULT NOW(); # 当前时间,避免后面一直获取时间
DECLARE num INT DEFAULT 0; # 结束标记
DECLARE tempTime varchar(10); # 统计时间变量
DECLARE tempCount INT DEFAULT 0; # 该店铺需要生成空数据的条数
DECLARE tempAddDay INT DEFAULT 1; # 统计时间需要加的天数,create_time加tempAddDay天等于统计时间

DECLARE init_shop_list CURSOR FOR SELECT id,create_time from shop; # 数据装进游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET num = 1; 
OPEN init_shop_list; # 打开游标
read_loop: LOOP
	FETCH init_shop_list INTO shopId,createTime; 
	IF num=1 THEN
		LEAVE read_loop; 
	END IF;
	SELECT datediff(DATE_SUB(nowDate,INTERVAL 1 DAY),createTime) INTO tempCount; # 查询这个店铺昨天到店铺创建相隔几天
	go_loop:LOOP
	  IF tempCount=0 THEN
            # 结束后数据初始化
            SET tempCount = 0;
            SET tempAddDay = 1;
	    LEAVE go_loop; 
	    END IF;
	    SELECT SUBSTRING(date_add(createTime, INTERVAL tempAddDay DAY),1,10) INTO tempTime; # 格式化统计时间字段
	    SET tempCount = tempCount-1; # -1让其向昨天靠拢
	    SET tempAddDay = tempAddDay+1; # 假设创建时间是前天,+1后即可将统计时间拉倒明天
	    INSERT IGNORE INTO shop_sale_day (id,shop_id, time,create_time) VALUES(REPLACE(UUID(),'-',''),shopId,tempTime,nowDate);
	END LOOP go_loop;
	
END LOOP read_loop;
CLOSE init_shop_list;
END $$
CALL initSaleMethod(); # 调用这个存储过程
drop procedure if exists initSaleMethod; # 初始化用,所以用完就扔了
posted @ 2021-06-18 12:10  互联网-搬砖人  阅读(92)  评论(0)    收藏  举报