需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录。现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标记删除。 代码如下: BEGIN
需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录。现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标记删除。
代码如下:
BEGIN
#定义变量
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
--结束END--
本文标题: MySQL数据篇(九)-
本文链接: https://www.lsjlt.com/news/2391.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-06-06
2024-06-06
2024-06-05
2024-06-04
2024-06-04
2024-06-03
2024-06-03
2024-06-03
2024-06-04
2024-06-03
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0