实战:mysql写存储过程并定时调用
有表:cap_meter_detail
字段:recordtime
情景:recordtime每半个小时记录一次,故一天会产生很很多数据,我们要做的是,每天00:00:00对cap_meter_detail 按时间拆分,比如,今天是2018年09月10号,那就将所有recordtime的日期为2018-09-10的拆分到表cap_meter_detail _20180610
思路:1、建表 cap_meter_detail _20180610
2、从cap_meter_detail 找出date(recordtime)="2018-09-10"的所有数据,插入到cap_meter_detail _20180610
3、将插入的数据从cap_meter_detail 里面删除
由于可能某个时间段数据库出问题,没有及时删除,所以,我们需要做个循环,用存储过程的思路解决,如下图,找出来有11天的,那就要循环11次
步骤:
1、写存储过程myFun_cap_meter_detail
BEGIN -- 定义变量
DECLARE tableName_bl VARCHAR(50);
-- 定义done
DECLARE done INT; -- 定义表名(tableName)游标
DECLARE rs_tableName CURSOR FOR -- 得到游标集合
SELECT
-- recordtime,
-- GROUP_CONCAT(id) ammeterid_group,
-- DATE_FORMAT(recordtime, '%Y%m%d'),
CONCAT('cap_meter_detail_',DATE_FORMAT(recordtime, '%Y%m%d')) tableName
FROM
`cap_meter_detail`
WHERE
recordtime < DATE(NOW())
GROUP BY
DATE_FORMAT(recordtime, '%Y%m%d'); DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET done=1; -- 初始化done,为0,false
set done = 0; open rs_tableName;
REPEAT FETCH rs_tableName into tableName_bl; -- 将类似 2018-03-19 00:22:00的数据插入到 cap_meter_20180319
if done<>1 then SET @var= tableName_bl; -- 建表 SET @createTableSqlStr=CONCAT("CREATE TABLE ",tableName_bl,"
(
id int(11) NOT NULL AUTO_INCREMENT,
ammeterid int(11) DEFAULT NULL,
a_voltage double(11,2) DEFAULT NULL,
b_voltage double(11,2) DEFAULT NULL,
c_voltage double(11,2) DEFAULT NULL,
frequence double(11,2) DEFAULT NULL,
a_current double(11,2) DEFAULT NULL,
b_current double(11,2) DEFAULT NULL,
c_current double(11,2) DEFAULT NULL,
total_power_factor double(11,2) DEFAULT NULL,
a_power_factor double(11,2) DEFAULT NULL,
b_power_factor double(11,2) DEFAULT NULL,
c_power_factor double(11,2) DEFAULT NULL,
total_active_power double(11,2) DEFAULT NULL,
a_active_power double(11,2) DEFAULT NULL,
b_active_power double(11,2) DEFAULT NULL,
c_active_power double(11,2) DEFAULT NULL,
total_reactive_power double(11,2) DEFAULT NULL,
a_reactive_power double(11,2) DEFAULT NULL,
b_reactive_power double(11,2) DEFAULT NULL,
c_reactive_power double(11,2) DEFAULT NULL,
recordtime datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=51927530 DEFAULT CHARSET=utf8"); -- 查看函数
SELECT @createTableSqlStr; -- 执行函数
PREPARE createTableSqlStr FROM @createTableSqlStr;
EXECUTE createTableSqlStr; -- 插入 SET @insertSqlStr=CONCAT("INSERT INTO ",tableName_bl,
" SELECT * FROM cap_meter_detail WHERE recordtime < DATE(NOW()) AND DATE_FORMAT(recordtime, '%Y%m%d')=right('",@var,"',8)"); -- 查看函数
SELECT @insertSqlStr; -- 执行函数
PREPARE insertSqlStr FROM @insertSqlStr;
EXECUTE insertSqlStr; -- 删除 SET @deleteSqlStr=CONCAT("DELETE FROM cap_meter_detail WHERE recordtime < DATE(NOW()) AND DATE_FORMAT(recordtime, '%Y%m%d')=right('",@var,"',8)"); -- 查看函数
SELECT @deleteSqlStr;
-- 执行函数
PREPARE deleteSqlStr FROM @deleteSqlStr;
EXECUTE deleteSqlStr; end if; -- 直到done变为true结束循环
UNTIL done END
REPEAT;
close rs_tableName;
END
2、写事件:myEvent_cap_meter_detail
CREATE EVENT
IF NOT EXISTS myEvent_cap_meter_detail ON SCHEDULE EVERY 24 HOUR ON COMPLETION PRESERVE DO
CALL myFun_cap_meter_detail();
3、启用事件
-- 查看事件状态
SHOW VARIABLES LIKE '%event_scheduler%'; -- 启用事件
SET GLOBAL event_scheduler =1
实战:mysql写存储过程并定时调用的更多相关文章
- mysql写存储过程并定时调用
设置一个定时任务:运行以下SQL -- 创建一个表test:字段endtime CREATE TABLE test (endtime DATETIME); -- 创建函数 :向test插入endt ...
- mysql写存储过程根据时间变化增加工龄
在工作中遇到要程序根据时间自动增加工龄的需求. php没办法自己发起请求,又不想在服务器上写计划任务crontab,通过用户请求来更改又不能保证用户会去操作. 用数据库的存储过程和事件来完成. 数据库 ...
- MySQL数据库----存储过程
存储过程 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql -- 存储过程的优点: -- 1.程序与数据实现解耦 -- 2.减少网络传输的 ...
- MySql创建存储过程,并使用事件定时调用
一.使用命令行创建存储过程的步骤 :参数详情参考 https://www.mysqlzh.com/ 1.模板 delimiter $$ # 设置分隔符为 '$$' ,mysql默认的语句分隔符为 ' ...
- JAVA如何调用mysql写的存储过程
存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...
- MySQL存储过程_创建-调用
阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的"脚本" 创建存储过程 调用存储过程 存储过程体 语句块标签 存储过程的参数 in:向过程里传参 out:过程向 ...
- shell脚本 如何调用Mysql的存储过程 解决方案
今天遇到一个在shell脚本里面要调用MySQL的存储过程,查阅了很多资料,发现有的都不好用,自己调试出了如下一种,拿来共享: 用mysql -e “ ”: 例如: mysql -uroot -p ...
- MySQL 开启事件 使用定时器调用存储过程
mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表:create table mytable (id int auto_incremen ...
- JDBC对MySQL数据库存储过程的调用
一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...
随机推荐
- scanf()函数
Scanf函数攻略: (A) 格式化说明符 格式字符 说明 %d 读入十进制整数 %u ...
- RequireJS 加载 js 执行顺序
初次接触RequireJS 对文档理解不很透彻,自己通过测试测到的执行顺序: 文档结构: |-amaze | -js | -amazeui.js | -jquery.min.js | -main.js ...
- Python: PS 图像调整--饱和度调整
本文用 Python 实现 PS 图像调整中的饱和度调整算法,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/detail ...
- BZOJ-2257:瓶子和燃料(裴蜀定理)
jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy的飞船上共有 N个瓶子(1<=N<=1000) ,经过 ...
- SDOI2017 Round1 Day2 题解
T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配. 费用流跑得过,可以不用KM. UPD:分数规划用迭代跑得飞快 ...
- Update 出现在的问题
报错提示:之前的操作没有完成,运行deanup被打断,请先执行Cleanup方法. 正常右键点击Cleanup,如果只让默认值勾选,可能还是会报这个错.所以正确操作如下: 全部选中再点击OK,这样就可 ...
- windbg调试堆破坏
堆破坏 所谓的堆破坏,是说没控制好自己的指针,把不属于你分配的那块内存给写覆盖了.这块内存可能是你程序的数据,也可能是堆的管理结构.那么这个会导致怎样的后果呢?可能的情况我们来yy下 把程序里的计算结 ...
- CS231n 2016 通关 第三章-SVM 作业分析
作业内容,完成作业便可熟悉如下内容: cell 1 设置绘图默认参数 # Run some setup code for this notebook. import random import nu ...
- JAVA 反射机制 获得 private 变量
public class Triangle { // 定义三角形的三边 protected long lborderA = 0; protected long lborderB = 0; protec ...
- ElasticSearch基础+文档CRUD操作
本篇博客是上一篇的延续,主要用来将年前学习ES的知识点做一个回顾,方便日后进行复习和汇总!因为近期项目中使用ES出现了点小问题,因此在这里做一个详细的汇总! [01]全文检索和Lucene (1)全文 ...