创建存储过程 定时器 ,启动定时器

一、定义定时器

每一小时执行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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值