开发笔记之MYSQL存储过程套用游标做数据统计

需求:存在一张customer表,现需要统计customer的总消费金额。但是MYSQL的实时查询在customer数据量非常大时查询速度会很慢,这时可以利用存储过程将customer的消费金额提前统计出来,用字段保存在customer表中,查询时只需直接在customer表中读取数据即可。

DELIMITER $$ #定义语句结束标识
DROP PROCEDURE IF EXISTS `tb_moneyNum`$$
CREATE PROCEDURE `tb_moneyNum`()    #创建存储过程
   BEGIN
   DECLARE v_customerId INT;    #定义customerId,用于查询此customer的消费统计
   DECLARE done INT DEFAULT 0;   #定义游标结束标识
   DECLARE v_moneyNum DECIMAL(10,2);  #定义消费总额
   DECLARE token INT DEFAULT 0;  #定义子游标结束标识

   #定义获取customer游标
   DECLARE c_cursor CURSOR FOR SELECT id FROM tb_customer WHERE isDel=0;
   #游标结束条件
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
   #打开游标
   OPEN c_cursor;
   cursor_loop:LOOP  #读取游标
    FETCH c_cursor INTO v_customerId; #将游标中查询的数据放入v_customerId
    IF done = 1 THEN  #判断当前游标是否需要结束,done=1时结束
       LEAVE cursor_loop; 
    END IF;
     SET v_moneyNum=0; #给消费总额赋初始值
    BEGIN 
        #定义统计子游标
        DECLARE c_cursor_item CURSOR FOR 
        SELECT SUM(cost) FROM tb_makeup_card WHERE customerId=v_customerId;
        #游标结束条件
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET token=1; 
        OPEN c_cursor_item;
        REPEAT  #读取统计结果
            FETCH c_cursor_item INTO v_moneyNum;  #将统计结果放入v_moneyNum
            #SELECT moneyNum;
            UNTIL token = 1 
        END REPEAT;
        CLOSE c_cursor_item;
        SET token=0;  #操作完成,重新赋token初始值,下次统计才会执行
        UPDATE tb_customer SET moneyNum = v_moneyNum WHERE id = v_customerId; #保存统计结果到customer表
        SET v_moneyNum=0;
   END;
   END LOOP;
   CLOSE c_cursor;
END$$
DELIMITER ;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值