欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-01 15:58:15
需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录。现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标记删除。 1、代码如下: BEGIN /* 用途:每天23:00执行一次,处理“开屏广告”和“门店主 ......

需求:有一个活动记录表 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