zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    .net5访问共享目录
    SqlServer 查询数据库表结构
    SqlServer查询所有表结构信息
    sqlserver 清掉工件号重复的数据
    产生18位的随机数作为bigint
    sql多表联合修改
    sp_addlinkedserver在存储过程中使用
    sqlserver 中随机取数据
    Winform选择目录路径与选择文件路径
    WinFrom 右下角弹出提示框
  • 原文地址:https://www.cnblogs.com/camg/p/11890448.html
Copyright © 2011-2022 走看看