Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

ROLLBACK in functions

3278558May 3 2017 — edited May 7 2017

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"...

This post has been answered by Paulzip on May 3 2017
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 1 2017
Added on May 3 2017
10 comments
531 views