最近寫存儲的時候,使用遊標循環插入記錄時,發現最後一行重複了一次,在百度和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 翻譯