1. 程式人生 > >mysql遊標最後一行重複的問題

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

最近寫儲存的時候,使用遊標迴圈插入記錄時,發現最後一行重複了一次,在百度和google搜尋了一下,有個回答比較靠譜,但沒有說出所以然來( ),後來又用英文單詞在google上 mysql cursor  last line repeat (英文不好,請見諒)搜尋了一下,stackOverFlow網站上有幾個相同的問題,找了幾個試了一下,發現了一個比較靠譜的,於是把它貼出來跟大家分享一下:

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

        描述:我得到一個儲存,從一個表裡面查出某些行,將其明細插入到另一張表中。我使用了遊標,但是遇到了一個大問題:遊標在同樣的一行中迴圈了兩次,所以我得到了兩個相同的插入(記錄),下面是儲存的程式碼

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”語句,看到了這個重複的結果。

        解決辦法:將遊標的值放到變數後,立刻檢查vdone這個標識,如下:

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”是失敗的,如果這個時候繼續處理,你會插入前一次的值。

英文太爛,翻譯的不好, 下面是原文連線,想看原文的同學請直接點選此連線:

轉載自 https://my.oschina.net/u/1383934/blog/667444  山月空的個人空間