Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment continuer le traitement de la boucle du curseur après une exception dans Oracle

Vous créez une procédure PL/SQL dans Oracle dans laquelle vous effectuez un traitement tout en parcourant le curseur et si une erreur (exception) se produit, vous ne souhaitez pas interrompre le traitement, mais vous souhaitez enregistrer l'erreur et continuer le traitement.

Ci-dessous, l'exemple est donné pour gérer une telle condition, dans laquelle j'ai créé deux sections d'exception, la première consiste à gérer l'erreur pendant la boucle du curseur et l'autre à gérer l'exception en dehors de la boucle du curseur.

SET SERVEROUTPUT ON;
DECLARE
   CURSOR c_emp
   IS
      SELECT ROWNUM, empno, ename FROM emp;

   vn        NUMBER;
   vsqlcode   VARCHAR2 (20);
   vsqlerrm   VARCHAR2 (4000);
BEGIN
   FOR c IN c_emp
   LOOP
      BEGIN
         IF c.ROWNUM = 3
         THEN
            -- Generate an error at line 3
            vn := 'x';
         END IF;

      EXCEPTION
         WHEN OTHERS
         THEN

            vsqlcode := SQLCODE;
            vsqlerrm := SQLERRM;

            INSERT INTO error_log (error_no, ERROR_TEXT)
                VALUES (vsqlcode, vsqlerrm);
      END;
   END LOOP;

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN 
            vsqlcode := SQLCODE;
            vsqlerrm := SQLERRM;

      ROLLBACK;
            INSERT INTO error_log (error_no, ERROR_TEXT)
                VALUES (vsqlcode, vsqlerrm);
      Commit;
END;