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 = 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM