1. 程式人生 > 其它 >MySQL遊標例項

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
			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; # 初始化用,所以用完就扔了