需求

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

思路

  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. 可参考链接
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐