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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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();


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
24天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
1月前
|
存储 SQL 关系型数据库
创建并配置RDS实例
在阿里云上创建RDS实例涉及登录控制台、进入RDS管理页面、创建实例、选择数据库引擎和版本、配置实例规格与存储、设定网络与安全组、设置实例信息、确认订单并支付,最后初始化数据库。操作步骤可能因界面更新或数据库引擎不同略有差异。
20 1
|
1月前
|
存储 关系型数据库 MySQL
Mysql基础第二十六天,使用存储过程
Mysql基础第二十六天,使用存储过程
28 0
Mysql基础第二十六天,使用存储过程
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】9、存储过程
【MySQL 数据库】9、存储过程
205 0
|
4天前
|
关系型数据库 MySQL 数据库
一台MySQL数据库启动多个实例
一台MySQL数据库启动多个实例
|
9天前
|
存储 SQL 关系型数据库
MySQL job 定时任务
MySQL job 定时任务
|
18天前
|
存储 SQL 关系型数据库
mysql存储过程示例
mysql存储过程示例
11 0
|
1月前
|
关系型数据库 MySQL 数据库
初始化RDS实例
初始化RDS实例
15 3
|
1月前
|
SQL 关系型数据库 MySQL
购买阿里云RDS实例
购买阿里云RDS实例
166 2
|
1月前
|
弹性计算 关系型数据库 MySQL
连接RDS实例
连接RDS实例
12 1