Mysql定時任務&存儲過程

一、定時任務

1.1 簡述

      Mysql 屬於中小型  數據庫 系統,它的事件調度器 Event Scheduler 是在  mysql 5.1 纔開始引入事件調度器是在  MySQL 5.1  中新增的另外一個特點功能,能夠做爲定時任務調度器,取代部分原先只能用操做系統任務調度器(如linux的crontab)才能完成的定時功能。事件調度器是定時觸發執行的,在這個角度上也能夠稱做是  " 臨時的觸發器  " 。觸發器只是針對某個表產生的事件執行一些語句,而事件調度器則是在某一個  ( 間隔  ) 時間執行一些語句。事件是由一個特定的線程來管理的,也就是所謂的  " 事件調度器  "  
 
1.2 查看開啓調度器
  •        查看event是否開啓 SHOW VARIABLES LIKE '%event_sche%';
  •      將事件計劃開啓 SET GLOBAL event_scheduler = 1; 
  •    關閉事件任務 ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE; 
  •      開啓事件任務 ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE; 
  •      查看事件任務 : SHOW EVENTS ;
1.3 建立簡單Demo  

 DELIMITER $$
      /*天天固定時間執行*/ 
 ALTER  EVENT `even_name` ON SCHEDULE EVERY 1 MINUTE STARTS '2012-01-13 00:00:00' [ON COMPLETION PRESERVE   ENABLE]
      /*非固定時間*/
/* ALTER  EVENT `even_name` ON SCHEDULE EVERY 1 MINUTE  [ON COMPLETION PRESERVE   ENABLE]*/
 DO BEGIN
    CALL TestPro();
  END$$

 DELIMITER ;

PS:MYSQL注意時區設置,默認非中國時區
     查看時區
     SHOW VARIABLES LIKE '%time_zone%';
     好比北京時間( GMT+0800
    set time_zone = ‘+8:00′; 
    system的話則跟操做系統同步

二、存儲過程

2.1 簡單Demo:

DELIMITER $$

DROP PROCEDURE IF EXISTS `TestPro`$$

CREATE [DEFINER=`root`@`localhost`] PROCEDURE `TestPro`()
BEGIN
       INSERT INTO SysRight(SysRightCode) VALUES(01000);
END$$
DELIMITER ;

2.2 U6_Demo

DROP PROCEDURE IF EXISTS  `ChannelStopHourLimited_3Minute` ;

DELIMITER $$

CREATE  PROCEDURE  `ChannelStopHourLimited_3Minute`()
BEGIN
/*
@cdate: 
功能:XXXXXXXXX
步驟:
         
相關表

         
執行頻率:每三分鐘一次, 執行時間:0:00 23:59
*/     
         -- 遇到SQL異常後執行回滾
         DECLARE prost datetime;
         -- DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
         -- 將存儲過程信息插入到 EventExecuteLog
         SET prost = NOW();
         INSERT INTO EventExecuteLog VALUES ('ChannelStopHourLimited_3Minute',prost,'0000-00-00 00:00:00','fail');
         -- 開啓事務
         -- START TRANSACTION;
         
         SET @ChannelIDs = '';
         -- 1 獲取全部超額的通道
         SELECT @ChannelIDs := CONCAT(@ChannelIDs, b.ChannelID, ',') FROM Channel c INNER JOIN ChannelCycleBilling b
         ON c.ChannelSno=b.ChannelID WHERE (c.Status = 0) AND (c.ChannelDayMaxFee < 10000000) AND (b.ThisHourFee > c.ChannelDayMaxFee/24);
         
         -- 2 下調該通道權重(把當前值大於 0的改爲負值)
         IF (@ChannelIDs <> '') THEN
                   SET @ChannelIDs = LEFT(@ChannelIDs, LENGTH(@ChannelIDs) - 1);
                   SET @mySql = CONCAT('UPDATE ChannelAreaWeight SET Weight = -Weight WHERE (ChannelID in (', @ChannelIDs, ') AND Weight > 0)');
                   PREPARE pstmt FROM @mySql-- 配置執行語句
                   EXECUTE pstmt;
                   DEALLOCATE PREPARE pstmt; -- 解除分配
         END IF;
         -- 設置此存儲過程運行成功信息插入到 EventExecuteLog
        UPDATE EventExecuteLog SET executetime=NOW(),Description='OK' WHERE StartTime=prost AND ProcedureName='ChannelStopHourLimited_3Minute';
        -- 提交事務
        -- COMMIT;
END $$
DELIMITER ;


PS declare定義變量必須寫在前面
           *  -- 註釋時,必需要帶空格,也就是「 -- 
           *   遊標定義能夠放在前面,即便有些臨時表尚未生成。

2.3 遊標

DECLARE CursorName CURSOR FOR SELECT field1, field2, .... FROM TableName; 

  -- 設置遊標讀取完畢後的標識
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET iStop = 1;

-- 打開遊標
OPEN CursorName;
-- 讀取記錄
FETCH CursorName INTO ifield1, ifield2, ....;
WHILE  ( iStop <> 1) DO
                  INSERT INTO Table VALUES(ifield1, ifield2, ...);
                   -- 讀取下一條數據
                 FETCH CursorName INTO ifield1, ifield2, ...;
 END WHILE;
 -- 關閉遊標
CLOSE CursorName;

PS: 遊標必須和定義變量同樣,在存儲過程開頭定義

2.4 建立臨時表

DROP  TEMPORARY TABLE IF EXISTS  `TableName`;
CREATE TEMPORARY TABLE TableName(ID INT, MtCnt INT);
相關文章
相關標籤/搜索