MySQL定时任务存储过程函数和动态表名实例

简介: MySQL定时任务存储过程函数和动态表名实例
#存储过程 每月AP和 FPV和 平均量
DROP PROCEDURE IF EXISTS pro_save_ap_manage_result_;
CREATE PROCEDURE pro_save_ap_manage_result_ () #名称:pro_save_ap_manage_result_
   BEGIN #开始
   -- --------------内容开始--------------------------
   insert into wbo_ap_manage_result
      SELECT DISTINCT
        count(DISTINCT a.AP_CODE) AP_CODE,
        -- a.SSID,
        sum(a.pv) pv,
        sum(a.uv) uv,
        sum(a.cpc) cpc,
        sum(a.cpm) cpm,
        sum(a.flow) flow,
        sum(a.P_FLOW) P_FLOW,
        sum(a.DURATION) DURATION,
        sum(a.RPV) RPV,
        sum(a.FPV) FPV,
        a.`MONTH`,
        a.`YEAR`,
        ROUND(sum(a.FPV) / count(DISTINCT a.AP_CODE)) pvAverage
      FROM
        wbo_ap_dtl_day a
      WHERE
        a. YEAR = year(curdate()) #本年
      AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m') #上月
      AND a. DAY >= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now())-1 day),interval 1 month),'%Y%m%d') #上月第一天
      AND a. DAY <= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now()) day),interval 0 month),'%Y%m%d') #上月最后一天
      GROUP BY
        a.`YEAR`,
        a.`MONTH`; #以';'结束
      #多条语句
      select now();#以';'结束
      -- --------------注意“;”内容结束--------------------------
   END;#结束
#事件 定时执行
DROP EVENT IF EXISTS eve_run_ap_manage_result_;
CREATE EVENT `eve_run_ap_manage_result_`
ON SCHEDULE EVERY 1 month STARTS '2016-10-01 00:00:00'#每月1号执行
ON COMPLETION NOT PRESERVE ENABLE
DO CALL `pro_save_ap_manage_result_`
/*
 DROP EVENT IF EXISTS eve_run_ap_manage_result_;
 CREATE EVENT `eve_run_ap_manage_result_`
 ON SCHEDULE EVERY 5 SECOND STARTS '2016-09-22 00:00:00'#每5s执行
 ON COMPLETION NOT PRESERVE ENABLE
 DO CALL `pro_save_ap_manage_result_`
*/
#存储过程 日均维度表月表分表
DROP PROCEDURE IF EXISTS pro_ap_month_dtl_day_;
CREATE PROCEDURE pro_ap_month_dtl_day_(in pvAverage VARCHAR (32),in tab_name VARCHAR (32))
BEGIN
set @STMT:=concat("INSERT INTO ",getApMonthTabName(tab_name), #动态表名
" SELECT DISTINCT
      a.AP_CODE AP_CODE,
      -- a.SSID,
      SUM(a.pv) pv,
      SUM(a.uv) uv,
      SUM(a.cpc) cpc,
      SUM(a.cpm) cpm,
      SUM(a.flow) flow,
      SUM(a.P_FLOW) P_FLOW,
      SUM(a.DURATION) DURATION,
      SUM(a.RPV) RPV,
      SUM(a.FPV) FPV,
      a.`MONTH`,
      a.`YEAR`,
      CASE
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) > 0 and ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) < ",pvAverage," THEN 2
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) >=",pvAverage," THEN 1
      ELSE 3
      END apState
   FROM
      wbo_ap_dtl_day a
   WHERE
      a. YEAR = year(curdate())#本年
        AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m') #上月
        AND a. DAY >= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now())-1 day),interval 1 month),'%Y%m%d') #上月第一天
        AND a. DAY <= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now()) day),interval 0 month),'%Y%m%d') #上月最后一天
   GROUP BY
      a.AP_CODE,
      a.`YEAR`,
      a.`MONTH`");
   PREPARE stmt FROM @STMT;
   EXECUTE stmt ;
end;
  • 调用存储过程
call pro_ap_month_dtl_day_('4','8');
call pro_ap_month_dtl_day_(getpvAverage(),date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%c'));
#存储过程 日均维度月临时表
DROP PROCEDURE IF EXISTS pro_wbo_ap_dtl_month_tmp_;
CREATE PROCEDURE pro_wbo_ap_dtl_month_tmp_(in pvAverage VARCHAR (32))
BEGIN
INSERT INTO wbo_ap_dtl_month_tmp
   SELECT DISTINCT
      a.AP_CODE AP_CODE,
      -- a.SSID,
      SUM(a.pv) pv,
      SUM(a.uv) uv,
      SUM(a.cpc) cpc,
      SUM(a.cpm) cpm,
      SUM(a.flow) flow,
      SUM(a.P_FLOW) P_FLOW,
      SUM(a.DURATION) DURATION,
      SUM(a.RPV) RPV,
      SUM(a.FPV) FPV,
      a.`day`,
      a.`MONTH`,
      a.`YEAR`,
      CASE
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) > 0 and ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) < pvAverage THEN 2
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) >= pvAverage THEN 1
      ELSE 3
      END apState
   FROM
      wbo_ap_dtl_day a
   WHERE
      a. YEAR = year(curdate())#本年
        AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m') #上月
        AND a. DAY >= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now())-1 day),interval 1 month),'%Y%m%d') #上月第一天
        AND a. DAY <= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now()) day),interval 0 month),'%Y%m%d') #上月最后一天
   GROUP BY
      a.AP_CODE,
      a.`YEAR`,
      a.`MONTH`;
end;
  • 调用
call pro_wbo_ap_dtl_month_tmp_('4');
call pro_wbo_ap_dtl_month_tmp_(getpvAverage());
#事件 定时执行
 DROP EVENT IF EXISTS eve_ap_month_dtl_day_;
   CREATE EVENT `eve_ap_month_dtl_day_`
   ON SCHEDULE EVERY 1 month STARTS '2016-10-01 00:30:00'#每月1号执行
   ON COMPLETION NOT PRESERVE ENABLE
   DO CALL `pro_ap_month_dtl_day_(getpvAverage(),fn_last_month())`
#函数 根据月份获得ap月分表名称
  DROP FUNCTION IF EXISTS getApMonthTabName;
  CREATE FUNCTION `getApMonthTabName`(_month varchar(32))
     RETURNS varchar(32)
     READS SQL DATA
  BEGIN
     DECLARE cnt varchar(32) DEFAULT '';
     IF _month = '1'
     THEN
      SET cnt = 'wbo_ap_dtl_day_m1';
     ELSEIF _month = '2'
     THEN
      SET cnt = 'wbo_ap_dtl_day_m2';
      ELSEIF _month = '3'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m3';
     ELSEIF _month = '4'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m4';
     ELSEIF _month = '5'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m5';
     ELSEIF _month = '6'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m6';
     ELSEIF _month = '7'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m7';
     ELSEIF _month = '8'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m8';
     ELSEIF _month = '9'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m9';
     ELSEIF _month = '10'
          THEN
           SET cnt = 'wbo_ap_dtl_day_m10';
     ELSEIF _month = '11'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m11';
     ELSEIF _month = '12'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m12';
     END IF ;
     RETURN cnt ;
  END;
#函数 获得平均数
   DROP FUNCTION IF EXISTS getpvAverage;
   CREATE FUNCTION `getpvAverage`()
      RETURNS int
      READS SQL DATA
   BEGIN
      DECLARE cnt int DEFAULT 0;
      select a.pvAverage into cnt from wbo_ap_manage_result a where
        a.YEAR = year(curdate()) #本年
        AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m'); #上月
      RETURN cnt ;
   END;
#函数 获得上月  
DROP FUNCTION IF EXISTS fn_last_month;
   CREATE FUNCTION `fn_last_month`()
      RETURNS int
      READS SQL DATA
   BEGIN
      DECLARE cnt int DEFAULT 0;
      select date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%c') into cnt;#上月2016-09-11
      RETURN cnt ;
   END;
#函数 获得上月
  DROP FUNCTION IF EXISTS fn_last_month1;
   CREATE FUNCTION `fn_last_month1`()
      RETURNS int
      -- READS SQL DATA
   BEGIN
      DECLARE cnt int DEFAULT 0;
      select date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m')#上月201609
                into cnt ;
      RETURN cnt ;
   END;
#获得上月 201609
select fn_last_month1();
#函数 上月天数
DROP FUNCTION IF EXISTS fn_last_month_num;
CREATE FUNCTION `fn_last_month_num`()
   RETURNS int
   -- READS SQL DATA
BEGIN
   DECLARE cnt int DEFAULT 0;
   select (DATEDIFF(DATE_ADD(curdate(), INTERVAL - DAY(curdate())+ 1 DAY), date_add(curdate()- DAY(curdate())+ 1, INTERVAL -1 MONTH))) ##上月天数
             into cnt ;
   RETURN cnt ;
END;
-- 上月天数 
select fn_last_month_num();


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
507 10
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
SQL 关系型数据库 MySQL
如何创建RDS MySQL定时任务?
RDS MySQL支持通过事件调度器(Event Scheduler)实现定时任务,如数据清理、统计报告等。需先开启Event Scheduler,再通过DMS或SQL创建、查看、删除事件,自动化执行数据库操作,提升运维效率。
|
存储 弹性计算 关系型数据库
如何通过控制台创建RDS MySQL实例
本文介绍了通过控制台创建RDS MySQL实例的详细步骤,包括准备工作、选择计费方式、地域、实例规格、存储空间等关键配置,并指导用户完成下单与实例查看。
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL数据库的多实例环境
MySQL多实例是指在一台服务器上运行多个MySQL服务,通过不同端口提供独立的数据服务。各实例共享安装程序,但使用各自的配置文件和数据文件,实现资源高效利用。本文详细介绍了如何通过“mysqld_multi”工具配置和启动多个MySQL实例,并演示了目录创建、初始化、配置文件修改及实例启动等操作步骤。
569 1
|
SQL Oracle 关系型数据库
在MySQL Shell里 重启MySQL 8.4实例
在MySQL Shell里 重启MySQL 8.4实例
577 2
|
关系型数据库 MySQL 调度
如何在MySQL中创建定时任务?
MySQL 事件调度器(Event Scheduler)可实现定时任务自动化。例如,每天凌晨清空 `test` 表,并在一个月后自动停止任务。需先启用调度器(`SET GLOBAL event_scheduler = ON`),再创建事件(使用 `CREATE EVENT` 定义执行频率和操作)。推荐用 `TRUNCATE` 提高效率,注意权限与时区设置。为防数据丢失,可结合备份机制。到期后事件自动禁用,建议定期清理。
755 4
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
存储 SQL NoSQL

推荐镜像

更多