zoukankan      html  css  js  c++  java
  • 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查询不一致;

    加上别名: 

    不加别名:

    数据库直接查询结果

  • 相关阅读:
    天梯赛 社交集群(并查集)
    蓝桥杯 正则问题(dfs)
    天梯赛L3-001. 凑零钱(01背包记录物品)
    天梯赛/PAT 二叉树总结
    GPLT天梯赛 L2-022. 重排链表
    蓝桥杯 2的次幂表示(递归)
    排列与组合的一些定理
    卡特兰数
    洛谷P1349 广义斐波那契数列(矩阵快速幂)
    Manacher's Algorithm 马拉车算法(最长回文串)
  • 原文地址:https://www.cnblogs.com/SimonHu1993/p/10721649.html
Copyright © 2011-2022 走看看