Mysql定時任務&存儲過程
1、定時任務
ALTER EVENT `even_name` ON SCHEDULE EVERY 1 MINUTE STARTS '2012-01-13 00:00:00' [ON COMPLETION PRESERVE ENABLE]
2.3 游標
FETCH CursorName INTO ifield1, ifield2, ...;
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 ;
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 ;
CALL TestPro();
END$$
DELIMITER ;
PS:MYSQL注意時區設置,默認非中國時區
查看時區
SHOW VARIABLES LIKE '%time_zone%';
比如北京時間( GMT+0800)
set time_zone = ‘+8:00′;
set time_zone = ‘+8:00′;
system的話則跟操作系統同步
2、存儲過程
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
/*
@author :
@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定義變量必須寫在前面
* “--” 注釋時,必須要帶空格,也就是“ -- ”
* 游標定義可以放在前面,即使有些臨時表還沒有生成。
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, ...);
-- 讀取下一條數據
END WHILE;
-- 關閉游標
CLOSE CursorName;
PS: 游標必須和定義變量一樣,在存儲過程開頭定義
2.4 創建臨時表
DROP TEMPORARY TABLE IF EXISTS `TableName`;
CREATE TEMPORARY TABLE TableName(ID INT, MtCnt INT);
本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!