实战: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 ...
- 骨牌覆盖问题 KxM
前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的 思路和上一篇文章所提到的3*N的 很类似: 依然是矩阵快速幂.我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂 ...
- Java 高阶 —— 相等性比较
1. 包装类 所有的相同类型的包装类对象之间的值的比较,全部使用 equals 方法: 对于 Integer a = ?,在 -128 到 127 范围内的赋值,Integer 对象是在 Intege ...
- eclipse导入jsp文件第一行报错
- ubuntu 16.04 安装 Matlab R2016b后启动出现的问题
(1)报以下错误: License checkout failed.License Manager Error -95MATLAB is unable to connect to the licens ...
- TFS独占签出代码
最近发现微软给我们提供了免费的TFS,地址:http://tfs.visualstudio.com/, 就注册了一个,但是我发现没办法独占签出. 在公司里,TFS有服务端,所以很好设置,但是注册微软的 ...
- vue-element el-select value-key
如果select绑定的值为对象,请务必指定value-key为它的唯一性标示 demo: data(){ return{ test:'', arr:[{id:1,name:'张三'},{id:2,na ...
- 【旧文章搬运】Windows中全局钩子DLL的加载过程
原文发表于百度空间,2011-03-24========================================================================== 看雪上别人 ...
- c++中IO输入输出流总结<二>
1 文件的打开和关闭 1.1 定义流对象 ifsteam iflie;//文件输入流对象 ifsteam iflie;//文件输出流对象 fsteam iflie;//文件输入输出流对象 1.2 打开 ...
- 2.SJ-SLAM-14
第三讲 三维空间刚体运动 本讲目标 理解三维空间的刚体运动描述方式:旋转矩阵.变换矩阵.四元数和欧拉角. 掌握Eigen库的矩阵.几何模块使用方法. 3.1 点.向量和坐标系,旋转矩阵 二维空间与三维 ...