MySQL数据篇(九)

database

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

回到顶部