mysql遊標最後一行重複的問題
阿新 • • 發佈:2019-01-05
最近寫儲存的時候,使用遊標迴圈插入記錄時,發現最後一行重複了一次,在百度和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 山月空的個人空間