我有一个存储过程,它检查一个表中的行以将其详细信息插入到另一个表中。我正在使用游标,但我遇到了一个大问题:游标在同一行上循环了 2 次。所以我得到 2 repeated inserts 。 这是sp代码:
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”开头的为普通变量。 我必须说游标的查询只返回 1 个值。 我也尝试过使用 LOOP,但结果相同。 我已经尝试“调试”插入一些 SELECTS 的过程,但我看到了重复的内容。
非常感谢。
最佳答案
在循环的最后一次迭代中,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;
关于MySQL游标两次获取相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16900482/