MySQL数据篇(九)--存储过程实现定时每天清理过期数据
时间:2021-07-01 10:21:17
帮助过:18人阅读
/*
用途:每天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
MySQL数据篇(九)--存储过程实现定时每天清理过期数据
标签:赋值 oca 用途 sele span div type 查询 pen