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