mysql遊標最後一行重複的問題

最近寫存儲的時候,使用遊標循環插入記錄時,發現最後一行重複了一次,在百度和google搜索了一下,有個回答比較靠譜,但沒有說出因此然來(http://blog.sina.com.cn/s/blog_4e4a3bd10100xc9p.html ),後來又用英文單詞在google上 mysql cursor  last line repeat (英文很差,請見諒)搜索了一下,stackOverFlow網站上有幾個相同的問題,找了幾個試了一下,發現了一個比較靠譜的,因而把它貼出來跟你們分享一下:html

        question:mysql遊標fetch返回兩次相同的值mysql

        描述:我獲得一個存儲,從一個表裏面查出某些行,將其明細插入到另外一張表中。我使用了遊標,可是遇到了一個大問題:遊標在一樣的一行中循環了兩次,因此我獲得了兩個相同的插入(記錄),下面是存儲的代碼sql

IF (SELECT 1 FROM NOVEDADES  WHERE LEGAJO_ID = pLEGAJO_ID AND FECHA >= pFECHA AND CONCEPTO_ID != 11 AND CONCEPTO_ID != 13 AND CONCEPTO_ID != 12 LIMIT 1) = 1
    THEN
        BEGIN
        DECLARE vCONCEPTO_ID INT;
        DECLARE vMONTO DECIMAL(12,2);
        DECLARE vID INT;
        DECLARE vDONE INT DEFAULT 0;

        DECLARE CURSOR_NOVEDADES CURSOR FOR     

        SELECT ID        FROM NOVEDADES 
        WHERE LEGAJO_ID = pLEGAJO_ID        AND FECHA >= pFECHA        AND CONCEPTO_ID != 11 
        AND CONCEPTO_ID != 13 
        AND CONCEPTO_ID != 12;

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDONE=1;

        OPEN CURSOR_NOVEDADES;

        SET vDONE = 0;

        REPEAT            FETCH CURSOR_NOVEDADES INTO vID;

            SELECT CONCEPTO_ID, MONTO INTO vCONCEPTO_ID, vMONTO            FROM NOVEDADES WHERE ID = vID;

            INSERT INTO LIQUIDACIONES_DETALLE (LIQUIDACION_ID, CONCEPTO_ID, MONTO)
            VALUES(pLIQUIDACION_ID, vCONCEPTO_ID, vMONTO);

        UNTIL vDONE END REPEAT;
        CLOSE CURSOR_NOVEDADES;
        END;
    END IF;

變量以「p」開頭的是存儲的「IN」參數,「v」開頭的是公共變量。須要說明的是這個遊標查詢只會返回一個值。我也試過用Loop循環,但仍是出現了一樣的結果。我試着調試存儲,插入相同的「SELECT」語句,看到了這個重複的結果。
oop

        解決辦法:將遊標的值放到變量後,馬上檢查vdone這個標識,以下:
fetch

REPEAT        
        FETCH CURSOR_NOVEDADES INTO vID;##重點
        if ! vdone then ##重點

            SELECT CONCEPTO_ID, MONTO INTO vCONCEPTO_ID, vMONTO            FROM NOVEDADES WHERE ID = vID;

            INSERT INTO LIQUIDACIONES_DETALLE (LIQUIDACION_ID, CONCEPTO_ID, MONTO)
            VALUES(pLIQUIDACION_ID, vCONCEPTO_ID, vMONTO);
       end

    UNTIL vDONE END REPEAT;

    緣由:最後一次經過循環遍歷的時候,「fetch」是失敗的,若是這個時候繼續處理,你會插入前一次的值。網站

英文太爛,翻譯的很差, 下面是原文鏈接,想看原文的同窗請直接點擊此鏈接:google

http://stackoverflow.com/questions/16900482/mysql-cursor-fetching-same-result-twice 翻譯

相關文章
相關標籤/搜索