2013-01-10 78 views
0

我有以下代碼:問題在最後一行creature_y循環沒有結束並且無限地插入相同的值(增加了guid)。 我嘗試了幾種改變繼續處理程序的方式,但似乎不是這樣。mySQL(存儲過程)遊標最後一行的遊標無限循環

DELIMITER $$ 
DROP PROCEDURE IF EXISTS creature_copy 
$$ 
CREATE PROCEDURE creature_copy() 
BEGIN 

    DECLARE done INT DEFAULT 0; 
    DECLARE new_guid INT(10); 

    -- Creature definition 
    DECLARE y_guid INT(10); 
    DECLARE y_id mediumint(8); 
    DECLARE y_map int(5); 
    DECLARE y_modelid mediumint(8); 
    DECLARE y_position_x float(10); 
    DECLARE y_position_y float(10); 
    DECLARE y_position_z float(10); 
    DECLARE y_orientation float(10); 
    DECLARE y_spawntimesecs INT(10); 
    DECLARE y_curhealth INT(10); 
    DECLARE y_curmana INT(10); 
    DECLARE y_MovementType tinyint(3); 

    -- waypoints definition 
    DECLARE w_id INT(10); 
    DECLARE w_point mediumint(8); 
    DECLARE w_position_x float(10); 
    DECLARE w_position_y float(10); 
    DECLARE w_position_z float(10); 
    DECLARE w_orientation float(10); 

    -- Generate creatures map 
    DECLARE creature_sel CURSOR FOR 
     SELECT guid,id, map, modelid, position_x, position_y, position_z, orientation, spawntimesecs, curhealth, curmana, MovementType 
     FROM creature_y; 

    -- Generate waypoints map 
    DECLARE waypoint_sel CURSOR FOR 
       SELECT id, point, position_x, position_y, position_z, orientation 
        FROM creature_movement 
         WHERE creature_movement.id = y_guid; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN creature_sel; 
-- Cleanup tables before re-running 
TRUNCATE creature_t; 
TRUNCATE waypoint_data; 

-- Set starting guid before loop 
SET new_guid = 504115; 

creature_loop:LOOP 

     if done = 1 THEN 
      -- set done = 0; 
      CLOSE creature_sel; 
      LEAVE creature_loop; 
     end if; 

     SET new_guid = new_guid + 1; 

    FETCH creature_sel INTO y_guid, y_id, y_map, y_modelid, y_position_x, y_position_y, y_position_z, y_orientation, y_spawntimesecs, y_curhealth, y_curmana, y_MovementType; 
    INSERT INTO creature_t(guid, id, map, modelid, position_x, position_y, position_z, orientation, spawntimesecs, curhealth, curmana, MovementType) VALUES(new_guid, y_id, y_map, y_modelid, y_position_x, y_position_y, y_position_z, y_orientation, y_spawntimesecs, y_curhealth, y_curmana, y_MovementType); 

     OPEN waypoint_sel; 
     waypoint_loop:LOOP 
       FETCH waypoint_sel INTO w_id, w_point, w_position_x, w_position_y, w_position_z, w_orientation; 

       IF done = 1 THEN 
        SET done = 0; 
        LEAVE waypoint_loop ; 
       END IF; 

       INSERT INTO waypoint_data(id, point, position_x, position_y, position_z, orientation) VALUES (new_guid, w_point, w_position_x, w_position_y, w_position_z, w_orientation); 
     END LOOP waypoint_loop; 
     CLOSE waypoint_sel; 

END LOOP creature_loop; 
CLOSE creature_sel; 
END; 
+0

'creature_y'是你的表,而不是循環。你的意思是'creature_loop'嗎? – inhan

+0

Yes意思是creature_loop在creature_t的最後一行佔據的位置,並且執行相同的讀取/插入無限次 –

+0

由於您有兩個遊標正在運行並正在更改另一個遊標的值,所以'繼續處理程序'可能會變得混亂。 – ethrbunny

回答

0

我找到了解決方案。 要使用2個不同的處理繼續(看指針是否在末尾),你需要的代碼分割成塊

BLOCK1: BEGIN 

    DECLARE done INT DEFAULT 0; 
    -- First cursor 
    DECLARE sel CURSOR FOR 
     SELECT column 
     FROM table; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN sel; 

    sel_loop:LOOP 
     if done = 1 THEN 
      set done = 0; 
      CLOSE sel; 
      LEAVE sel_loop; 
     end if; 

     FETCH sel INTO variable1; 
     -- Do something in loop 
     -- Start second code-block  
     BLOCK2: BEGIN 
     DECLARE done2 INT DEFAULT 0; 

     -- define second cursor 
     DECLARE sel2 CURSOR FOR 
      SELECT column 
      FROM table 
       WHERE column = condition; 
      -- define second handler 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1; 
      -- now you can make second cursor loop and it will finish properly. 
     OPEN sel2; 
     sel2_loop:LOOP 
       FETCH sel2 INTO variable2; 

       IF done2 = 1 THEN 
        SET done2 = 0; 
        LEAVE sel2_loop ; 
       END IF; 

     -- do something in second loop 
     END LOOP waypoint_loop; 
     CLOSE waypoint_sel; 

-- End your code blocks and close first loop/cursor 
END BLOCK2; 

END LOOP sel_loop; 
CLOSE sel; 
END BLOCK1