mysql数据遍历(语句遍历)

需求

目前有月统计用水表,但是没有年统计用水表。
因为之前的问题,月统计用水表查询太慢,所以需要在数据库新建一个事件,一个月执行一次,将月统计计算后的年统计用水数据存入新的表中

思路

  1. 通过网上查找资料,采用游标方式遍历,可参考链接
  2. 从月统计用水表查询全部数据,遍历全部数据
  3. 判断年用水统计表是否已存在该年数据,已存在更新,不存在插入
BEGIN
	-- 定义变量
	DECLARE s int DEFAULT 0;
	DECLARE deviceIdx varchar(50);
	DECLARE yearx varchar(50);
	DECLARE waterx DOUBLE(13,3);
	-- 定义游标,并将sql结果集赋值到游标中
	DECLARE report CURSOR FOR SELECT deviceId,`year`,SUM(water) AS water FROM to.me_obj_monthrecord WHERE objType = '030909' GROUP BY deviceId,`year`;
	-- 声明当游标遍历完后将标志变量置成1
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET s = 1;
	-- 打开游标
	open report;
		-- 将游标中的值赋值给变量
		fetch report into deviceIdx,yearx,waterx;
		-- 当s不等于1,即未遍历完,一直循环
		WHILE s<>1 DO
			IF (SELECT COUNT(*) AS count FROM me_monthrecord WHERE deviceId = deviceIdx AND `year` = yearx) > 0 THEN
				UPDATE `to`.`me_monthrecord` SET `deviceId` = deviceIdx, `year` = yearx, `water` = waterx WHERE deviceId = deviceIdx AND `year` = yearx;
			ELSE
				INSERT INTO to.me_monthrecord (id,deviceId,`year`,water) VALUES (UUID(),deviceIdx,yearx,waterx);
			END IF;
			-- 将游标中的值再赋值给变量,供下次循环使用
			fetch report into deviceIdx,yearx,waterx;
			-- 当s等于1时表明遍历以完成,退出循环
		END WHILE;
	-- 关闭游标
	close report;
END

mysql知识点补充

  • mysql :=和=的区别
  1. 只有在set和update时才是和:=一样,赋值的作用,其它都是等于的作用。鉴于此,用变量实现行号时,必须用:=
  2. 不只在set和update时时赋值的作用,在select也是赋值的作用
  • mysql 存储过程之游标(DECLARE)
  1. 可参考链接
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值