######在游標循環中,如果含有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查詢不一致;
加上別名: 

不加別名:


數據庫直接查詢結果

