一、定义定时器
每一小时执行updateOrderStatus存储过程 ,此定时器的名称是order_status_event
CREATE EVENT IF NOT EXISTS order_status_event ON SCHEDULE EVERY 1 HOUR ON COMPLETION PRESERVE DO CALL updateOrderStatus();
二、定义存储过程
此过程主要操作的是先查找相应的数据集合,然后通过游标的方式将数据集合中的数据插入到相应的表中
DELIMITER $$
USE `数据库名称`$$DROP PROCEDURE IF EXISTS `updateOrderStatus`$$
CREATE DEFINER=`wodsydb`@`%` PROCEDURE `updateOrderStatus`()
BEGIN
/**更新订单状态表订单状态**/
DECLARE done INT DEFAULT 0; //用于跳出循环标示
DECLARE index_num INT DEFAULT 0; // 定义循环下标
DECLARE orderNo VARCHAR(128); //需要循环的数据
/* 声明游标 */
DECLARE rs CURSOR FOR SELECT order_no FROM order_record od
WHERE od.order_submit_time <CURRENT_TIMESTAMP - INTERVAL 5 MINUTE AND (od.order_status=1 OR od.order_status=3); //其中select语句查出来的数据是需要循环的数据
/* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
/* 打开游标 */
OPEN rs;
/* 遍历数据表 */
REPEAT
/* 逐个取出当前字段的值,需要进行最大值的判断 */
FETCH NEXT FROM rs INTO orderNo; //将循环的数据放到orderNo变量中
IF NOT Done THEN
IF index_num = 0 THEN //拼串,因为要插入多条数据,如果一条一条插入时间较长,将所有要插入的数据拼成一个串,执行一条sql即可,形式为insert into test values(id,name),(id,name),(id,name),这样就是插入三条语句,比执行三条insert语句要快的多
SET @value_str = CONCAT("('",DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'),index_num,"','",orderNo,"',6,'",NOW(),"')");
ELSE
SET @value_str = CONCAT(@value_str,",('",DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'),index_num,"','",orderNo,"',6,'",NOW(),"')");
END IF;
SET index_num = index_num + 1;
END IF;
UNTIL Done END REPEAT;
IF @value_str <>'' THEN //跳出循环后执行insert语句
SET @value_str = CONCAT("INSERT INTO order_status VALUES ",@value_str);
PREPARE stmt FROM @value_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
INSERT INTO job_log(job_id,job_name,job_desc,job_time,mark) VALUES(NULL,'updateOrderStatus',@value_str,NOW(),'PROCEDURE');
SET @value_str='';
END IF;
/* 关闭游标 */
CLOSE rs;
/**更新订单表订单状态**/
UPDATE order_record od SET od.order_status=6
WHERE od.order_submit_time <CURRENT_TIMESTAMP - INTERVAL 5 MINUTE AND (od.order_status=1 OR od.order_status=3);
END$$
DELIMITER ;
三、开启定时器
查看event是否开启: show variables like '%sche%';
将事件计划开启: set global event_scheduler=1;
关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;
开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;