MySQL数据篇(九)--存储过程实现定时每天清理过期数据

需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录。现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标记删除。

1、代码如下:

BEGIN
    /*
        用途:每天23:00执行一次,处理“开屏广告”和“门店主页”关联设备信息,如果当前时间活动已过期,及将表下关联记录标记为已删除状态
    */
    
    #定义变量
    DECLARE done INT;#游标标记
    DECLARE timestampTmp INT;#当前时间戳
    DECLARE ad_id INT;#需要清除的广告活动id
    DECLARE ad_ad_type INT;#广告类型1
    DECLARE ad_ad_location INT;#广告类型2
    DECLARE devices_ad INT;#设备关联表需要清除的广告活动id
    DECLARE err INT; #是否有sql错误
    
    

    #创建游标,并且存储数据,获取未处理,已结束的广告活动id
    DECLARE cur_ad CURSOR
                    FOR
                    SELECT id,ad_type,ad_location FROM t_ad WHERE is_handle = 0 AND end_time < timestampTmp LIMIT 500;
    
    #游标中的内容执行完后将done设置为1
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    #检查sql是否有错
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1; 

    #赋值当前时间
    SET timestampTmp = UNIX_TIMESTAMP();

    #打开游标
    OPEN cur_ad;

    #执行循环
    posLoop:LOOP
            
                #游标结束或者SQL错误,结束循环
                IF done = 1 or err = 1 THEN
                        LEAVE    posLoop;
                END IF;

                #取游标中的值
                FETCH    cur_ad INTO    ad_id,ad_ad_type,ad_ad_location;

                #查询数据,判断是否需要修改
                SELECT    COUNT(1) INTO    devices_ad FROM t_shake_devices_relation WHERE    relation_id = ad_id AND is_deleted = 0;
                
                #存在即修改
                IF devices_ad > 0 THEN
                        UPDATE t_shake_devices_relation SET is_deleted = 1 WHERE relation_id = ad_id;
                        
                        #修改成功后标记t_ad表为已处理
                        IF ROW_COUNT() > 0 THEN
                                UPDATE t_ad SET is_handle = 1 WHERE id = ad_id;
                        END IF;

                END IF;
    
    #结束循环
    END    LOOP posLoop;

    #释放游标
    CLOSE    cur_ad;
END

 

posted @ 2019-11-19 16:37  在斑马线上散布  阅读(1168)  评论(0编辑  收藏  举报
夫人不言,言必有中。这是高级臣僚的一种可贵品质,言辞精炼,直抵要害。