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 =0AND end_time < timestampTmp LIMIT 500;
#游标中的内容执行完后将done设置为1
DECLARECONTINUE HANDLER FORNOT FOUND SET done =1;
#检查sql是否有错
DECLARECONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
#赋值当前时间
SET timestampTmp = UNIX_TIMESTAMP();
#打开游标
OPEN cur_ad;
#执行循环
posLoop:LOOP
#游标结束或者SQL错误,结束循环
IF done =1or err =1THEN
LEAVE posLoop;
ENDIF;
#取游标中的值
FETCH cur_ad INTO ad_id,ad_ad_type,ad_ad_location;
#查询数据,判断是否需要修改
SELECTCOUNT(1) INTO devices_ad FROM t_shake_devices_relation WHERE relation_id = ad_id AND is_deleted =0;
#存在即修改
IF devices_ad >0THEN
UPDATE t_shake_devices_relation SET is_deleted =1WHERE relation_id = ad_id;
#修改成功后标记t_ad表为已处理
IF ROW_COUNT() >0THEN
UPDATE t_ad SET is_handle =1WHERE id = ad_id;
ENDIF;
ENDIF;
#结束循环
END LOOP posLoop;
#释放游标
CLOSE cur_ad;
END
以上是 MySQL数据篇(九) 的全部内容, 来源链接: utcz.com/z/531427.html