• 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
  • 相关阅读:
    Web前端学习第五天——————HTML篇.019页面布局练习
    1111
    开发者如何利用数据分析提高收入
    开发者进行广告合作的几大误区
    高仿人人Android梦想版终极源码发送(转)
    移动开发者如何获取免费流量
    Inno setup常用代码【收藏】
    Inno setup常用代码补充【收藏】
    QT for Window程序部署
    Inno Setup自定义卸载文件名称【收藏】
  • 原文地址:https://www.cnblogs.com/camg/p/11890448.html
Copyright © 2020-2023  润新知