mysql存儲過程游標使用


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

加上別名: 

不加別名:

數據庫直接查詢結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM