2012-10-22 36 views
0

我想第一次創建存儲過程和遊標,它不像預期的那樣行爲。一切都很好,但輸出數據不正確。如果我手動迭代,我會得到我所期望的,但不通過存儲過程。MYSQL遊標重複錯誤的數據

如果您查看下面的輸出表,前三條記錄是正確的,並且所有後續條目的GID都是正確的,但PTS彙總不正確並重復相同的值。

步驟:

DELIMITER // 

CREATE PROCEDURE creategamesummary() 

BEGIN 

DECLARE curdone TINYINT DEFAULT 0; 
DECLARE curgid INT; 
DECLARE curwk INT; 

DECLARE gamescursor CURSOR 

FOR 

SELECT g1.GID FROM games g1 WHERE g1.SEAS = 2008 AND g1.WK > 4 AND (g1.V = 'BAL' OR g1.H = 'BAL') ORDER BY GID; 

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET curdone=1; 

OPEN gamescursor; 

REPEAT 
    FETCH gamescursor into curgid; 

    SET curwk = (SELECT WK FROM games WHERE GID = curgid); 

    REPLACE INTO gamesummary 
    SELECT 
    curgid as GID, 
    SUM(t1.PTS) as PTS 
FROM 
    team t1 
WHERE 
    t1.GID IN (
    SELECT 
    g2.GID 
FROM 
    games g2 
WHERE 
    (g2.V = 'BAL' OR 
    g2.H = 'BAL') AND 
    g2.SEAS = 2008 AND 
    g2.WK <= curwk 
) AND t1.TNAME = 'BAL'; 

UNTIL curdone END REPEAT; 

    CLOSE gamescursor; 

END// 

DELIMITER ; 

輸出表:

GID,PTS 
2182,75 
2196,78 
2212,105 
2223,127 
2240,127 
2259,127 
2268,127 
2288,127 
2306,127 
2327,127 
2330,127 
2346,127 
2371,127 
2379,127 
2381,127 
2385,127 

回答

0

回答我的問題,但我設法重構查詢到下面的代碼。由於這是我對遊標和存儲過程的第一次嘗試,因此我仍然很欣賞第一版中出現錯誤的反饋。

DELIMITER // 

CREATE PROCEDURE creategamesummary2() 

BEGIN 

DECLARE curdone TINYINT DEFAULT 0; 
DECLARE curteam varchar(3); 

DECLARE teamcursor CURSOR 

FOR 

SELECT TNAME FROM team WHERE GID in (SELECT GID from games WHERE SEAS = 2008) GROUP BY TNAME; 

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET curdone=1; 

OPEN teamcursor; 

WHILE NOT curdone DO 
    FETCH teamcursor into curteam; 

    REPLACE INTO gamesummary2 
SELECT 
    g1.GID, 
    g1.WK, 
    curteam AS TNAME, 
    (
    SELECT SUM(t1.PTS) 
    FROM team t1 
    WHERE t1.GID IN (
     SELECT g2.GID 
     FROM games g2 
     WHERE g2.WK <= g1.WK AND (g2.V = curteam OR g2.H = curteam) AND g2.SEAS = 2008) AND 
    t1.TNAME = curteam) AS SUM_PTS 
FROM 
    games g1 
WHERE 
    g1.SEAS = 2008 AND 
    g1.WK > 4 AND 
    (g1.V = curteam OR g1.H = curteam) 
GROUP BY GID, WK, curteam; 

END WHILE; 

    CLOSE teamcursor; 

END// 

DELIMITER ;