######在游標循環中,如果含有select查詢,查詢的結果為null的情況會導致游標提前退出循環********* 在游標內的select可能為null的項后面重置循環結果可避免游標只循環一次的情況; SET done = false; # 這里很關鍵::因為如果select查詢不到數據項直接退出循環 參考:https://www.cnblogs.com/Braveliu/p/10144510.html
BEGIN
DECLARE idCount int DEFAULT 0;-- 定義查詢的id count DECLARE nameCount int DEFAULT 0;-- 統計相同名字合計 DECLARE openerId int DEFAULT 0; DECLARE openerName VARCHAR(255); -- 遍歷數據結束標志 DECLARE done INT DEFAULT FALSE; -- 定義游標 DECLARE cur CURSOR FOR select count(*) count,opener FROM qf_invoice where (`status` >10 or `status` =1) GROUP BY opener; -- 將結束標志綁定到游標 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打開游標 OPEN cur; -- 開始循環 read_loop: LOOP -- 提取游標里的數據,這里只有一個,多個的話也一樣; FETCH cur INTO nameCount,openerName; SELECT nameCount,openerName; -- 聲明結束的時候 IF done THEN SELECT 'done'; LEAVE read_loop; END IF; -- 業務邏輯 SELECT id,COUNT(id) into openerId,idCount from qf_merchant_invoice where `status` = 1 and opener = openerName; if(idCount !=0) THEN -- 查詢結果為null時游標會主動退出 update qf_merchant_invoice SET invoice_number = invoice_number + nameCount where id = openerId; ELSE INSERT into qf_merchant_invoice(opener,invoice_number,create_time,STATUS) VALUES(openerName,nameCount,NOW(),1); end if; END LOOP; -- 關閉游標 CLOSE cur; END
有一點:有時候使用游標要使用別名,不然會造成游標結果和sql查詢不一致;
加上別名:
不加別名:
數據庫直接查詢結果