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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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;
相关文章
|
12月前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
11月前
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
存储 SQL NoSQL
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
215 5
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
250 3
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
299 1
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
191 0
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
4518 4
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
存储 关系型数据库 MySQL
MYSQL--存储过程操作
MYSQL--存储过程操作

推荐镜像

更多