2014-11-14 12 views
0

我有MySQL存儲過程,將使用FEDERATED表從遠程服務器創建臨時表。然後程序使用這些臨時表來做一些工作。如何解決MySQL程序 - 爲什麼循環正在達到最大運行?

我看到了一些問題,即我得到一個錯誤,如

Unable to connect to foreign data source 
Got timeout reading communication packets 
Unable to connect to foreign data source 
Got error 1430 from storage engine 

這裏的問題是,如果這些臨時表未能創建整個過程,因爲這些表不存在失敗。

所以我想我可以做一些檢查嘗試創建臨時表後,如果嘗試返回錯誤,然後我回去再試一次。停止無限循環我在10次嘗試之後添加了一個條件。

我遇到的問題是腳本退出並且它不會一直運行到最後。

這裏是過程的一部分,其中程序正在退出並且不知道爲什麼。

DELIMITER $$ 

CREATE DEFINER=`root`@`10.%` PROCEDURE `act`() 
MAIN: 
BEGIN 

DECLARE current_procedure_name CHAR(60) DEFAULT 'activities'; 
DECLARE last_run_time DATETIME DEFAULT NULL; 
DECLARE current_run_time_start DATETIME DEFAULT NOW(); 

    -- set the SQL mode to '' 
    SET SQL_MODE = ''; 

    -- set MySQL Safe mode OFF on update 
    SET SQL_SAFE_UPDATES = 0; 

SET @trys = 0; 

loop_label: LOOP 

    SET @trys := @trys+1; 
    -- db.view_users is a federated table 
    DROP TEMPORARY TABLE IF EXISTS view_users1, view_users2, view_users3; 
    CREATE TEMPORARY TABLE view_users1 (KEY(user_id)) ENGINE=MEMORY AS 
    SELECT user_id, fullname 
    FROM db.view_users; 

    IF(@@error_count > 0 OR @trys > 10) THEN 

     -- if there are too many tries to create the temporary table and it keeps failing Quit!! 
     IF(@trys > 10) THEN 
      LEAVE MAIN; 
     ELSE 
      -- sleep for 10 seconds and go back to create the table again 
      SELECT SLEEP(10); 
      ITERATE loop_label; 
     END IF; 


    END IF; 

    CREATE TEMPORARY TABLE view_users2 (KEY(user_id)) ENGINE=MEMORY AS 
    SELECT * FROM view_users1; 

    IF(@@error_count > 0) THEN 
     ITERATE loop_label; 
    END IF; 

    CREATE TEMPORARY TABLE view_users3 (KEY(user_id)) ENGINE=MEMORY AS 
    SELECT * FROM view_users1; 

    IF(@@error_count > 0) THEN 
     ITERATE loop_label; 
    END IF; 

END LOOP; 


-- set MySQL Safe mode back ON on update 
    SET SQL_SAFE_UPDATES = 1; 
END 

我怎樣才能找出它爲什麼退出?它似乎@trys達到11,它退出,但我不明白爲什麼會呢?

我試圖在程序之外運行此代碼,第二行返回0錯誤;

DROP TEMPORARY TABLE IF EXISTS view_users1, view_users2, view_users3; 
CREATE TEMPORARY TABLE view_users1 (KEY(user_id)) ENGINE=MEMORY AS 
SELECT user_id, fullname 
FROM db.view_users; 
SELECT @@error_count; 

第二個問題,有沒有更好的方法解決這個問題?這個程序一直運行非常重要。

回答

0

我終於找出問題的原因。

從手動13.6.5.5 LOOP Syntax

環路內的語句被重複,直到所述環是 終止。通常,這是通過LEAVE語句完成的。 在一個存儲功能,RETURN也可使用,其離開 功能完全

在剛剛結束END LOOP;之前我需要添加LEAVE loop_label結束LOOP其他明智它將繼續直到達到@trys 11;

相關問題