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 '02000' 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

 

  

 

         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM