Hi I have the following function:
FUNCTION SF_PROCPAGRAPRUC(pIdProceso CTL_CARGAMASIVA.idproceso%TYPE,
pInput CHAR) RETURN VARCHAR2 IS
vRpta VARCHAR2(256) := '0~';
vRptaProcFila VARCHAR2(256);
vMensajeAdicional VARCHAR2(256);
vNumCOMMIT PLS_INTEGER := 30;
vUsuario PAGRAPRUCMASIVO.LOGUSUARIO%TYPE;
vRegs PLS_INTEGER := 0;
TYPE TListaML IS TABLE OF PAGRAPRUCMASIVOARCH%ROWTYPE INDEX BY PLS_INTEGER;
vListaArchML TListaML;
c2_rec PAGRAPRUCMASIVOARCH%ROWTYPE;
vCodAdquirente CHAR(2);
vIdPagoRapido PAGORAPIDO.IDPAGORAPIDO%TYPE;
vIdProceso PAGORAPIDO.IDPROCESO%TYPE;
vIncluido PAGRAPRUCMASIVO.Incluido%TYPE;
PROCEDURE LSP_Mensaje(pIdFila PAGRAPRUCMASIVOARCH.IDPAGRAPRUCMASIVOARCH%TYPE,
pProcesoOK CHAR,
pMensajeUsuario VARCHAR2,
pMensajeErrorBD VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE PAGRAPRUCMASIVOARCH
SET indprocesado = PKG_CARGASMASIVAS.gINDICADOR_SI,
indprocesook = pProcesoOK,
mensajeerrorusuario = nvl(pMensajeUsuario, mensajeerrorusuario),
mensajeerrorbd = nvl(pMensajeErrorBD, mensajeerrorbd)
WHERE IDPAGRAPRUCMASIVOARCH = pIdFila;
COMMIT;
END;
BEGIN
--Usuario
BEGIN
SELECT LOGUSUARIO,
CODIGOADQUIRENTE,
IDPAGORAPIDO,
INCLUIDO
INTO vUsuario,
vCodAdquirente,
vIdPagoRapido,
vIncluido
FROM PAGRAPRUCMASIVO
WHERE idctlcargamasiva = pIdProceso;
EXCEPTION
WHEN OTHERS THEN
vUsuario := NULL;
END;
UPDATE PAGRAPRUCMASIVOARCH A
SET A.idpagorapido = vIdPagoRapido
WHERE A.IdPagRaprucMasivo IN
(SELECT T.IdPagRaprucMasivo FROM PAGRAPRUCMASIVO T
WHERE T.idctlcargamasiva = pIdProceso AND T.INCLUIDO = vIncluido);
COMMIT;
vIdProceso := PKG_PAGORAPIDO.SF_GENERAIDPROCESOTRAMA();
-- A partir de aqui procesar
SAVEPOINT GRABARSEGURO;
SELECT A.* BULK COLLECT
INTO vListaArchML
FROM PAGRAPRUCMASIVOARCH A
INNER JOIN PAGRAPRUCMASIVO T
ON (A.IdPagRapRucMasivo = T.IdPagRapRucMasivo)
WHERE T.idctlcargamasiva = pIdProceso
AND nvl(A.indprocesado, 'N') = 'N' AND T.INCLUIDO = vIncluido AND A.INCLUIDO = vIncluido
ORDER BY A.numerolinea;
FOR idxTabla IN 1 .. vListaArchML.COUNT
LOOP
SAVEPOINT GRABARSEGURO;
c2_rec := vListaArchML(idxTabla);
vRegs := vRegs + 1;
BEGIN
c2_rec.LOGUSUARIO := vUsuario;
vRptaProcFila := CM_INS_PRRUC(c2_rec, vCodAdquirente, vIdProceso,vIncluido);
EXCEPTION
WHEN OTHERS THEN
LSP_Mensaje(c2_rec.IDPAGRAPRUCMASIVOARCH, PKG_CARGASMASIVAS.gINDICADOR_NO, 'Error de BD', SQLERRM);
GOTO SALIDA_LOOP;
END;
IF SUBSTR(vRptaProcFila, 1, 1) = 'E' THEN
--Marcar el error en el archivo de carga.
LSP_Mensaje(c2_rec.IDPAGRAPRUCMASIVOARCH, PKG_CARGASMASIVAS.gINDICADOR_NO, SUBSTR(vRptaProcFila, 2), '');
GOTO SALIDA_LOOP;
END IF;
LSP_Mensaje(c2_rec.IDPAGRAPRUCMASIVOARCH, PKG_CARGASMASIVAS.gINDICADOR_SI, RTRIM(vMensajeAdicional), '');
CONTINUE;
<<SALIDA_LOOP>>
ROLLBACK TO GRABARSEGURO;
END LOOP;
COMMIT;
RETURN vRpta;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
gOraErr := SUBSTR(SQLERRM, 1, 256);
gOraCode := ABS(SQLCODE);
RETURN 'E' || gOraErr || ' ORA-<' || TO_CHAR(gOraCode) || '>~';
END SF_PROCPAGRAPRUC;
But I am not sure how ROLLBACK statement works, for instance: ROLLBACK TO GRABARSEGURO; and the last "ROLLBACK"...