需求:有一個活動記錄表 t_ad ,商家每次發起一個活動,就會在 t_shake_devices_relation 表裡面生成一些關聯記錄。現在寫一個存儲過程實現,如果活動過期,就將關聯表裡面的數據標記刪除。 1、代碼如下: BEGIN /* 用途:每天23:00執行一次,處理“開屏廣告”和“門店主 ...
需求:有一個活動記錄表 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
-----END
影子是一個會撒謊的精靈,它在虛空中流浪和等待被髮現之間;在存在與不存在之間....