MySQL儲存過程-->通過遊標遍歷和異常處理遷移資料到歷史表

us_yunleiwang發表於2013-12-06

-- 大表資料遷移,每天凌晨1點到5點執行,執行間隔時間10分鐘,遷移舊資料到歷史表。

DELIMITER $$

 

USE `dbx`$$

 

DROP PROCEDURE IF EXISTS `pro_xx`$$

 

CREATE  PROCEDURE `pro_xx`()

BEGIN  

   DECLARE p_oalid INT DEFAULT 0;

   DECLARE STOP INT DEFAULT 0; 

   

   DECLARE cur_oalid CURSOR FOR

         SELECToal.id FROM oal_xxx oal WHERE oal.`ymd`

   DECLARE EXIT HANDLER FOR SQLSTATE '02000'  /**包含遊標not found*/

   BEGIN

        SET STOP=1;

         INSERTINTO db_logs(log_type,table_name,action_name,log_msg,create_time)

         SELECT1, 'oal_xxx','pro_oal_log_move',CONCAT('primary key:',p_oalid,' 遊標執行正常結束!'),NOW();       

   END;

       

   DECLARE EXIT HANDLER FOR SQLEXCEPTION

   BEGIN

         SETSTOP=1;

         INSERTINTO db_logs(log_type,table_name,action_name,log_msg,create_time)

         SELECT2, 'oal_xxx','pro_oal_log_move',CONCAT('primary key:',p_oalid,' 移動執行失敗'),NOW();

   END; 

   

   OPEN cur_oalid;      

      

    -- 讀取一行資料到變數  

   FETCH cur_oalid INTO p_oalid;

 

     -- 這個就是判斷是否遊標已經到達了最後  

   WHILE STOP <> 1 DO 

         -- select p_id;

         START TRANSACTION; 

     --   進行資料遷移

             REPLACE INTO oal_xxx_history SELECT oal.*FROM oal_xxx oal WHERE oal.id=p_oalid ;

             DELETE FROM oal_xxx WHERE id=p_oalid;

                          

             -- INSERT INTO t (tid) VALUES (p_tid);

         COMMIT;  

            

           

        -- 讀取下一行的資料   

       FETCH cur_oalid INTO p_oalid;

      END WHILE;         

   CLOSE cur_oalid; -- 關閉遊標  

 END$$

 

DELIMITER ;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062498/,如需轉載,請註明出處,否則將追究法律責任。

相關文章