Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como continuar o processamento do loop do cursor após a exceção no Oracle


Você está criando um procedimento PL/SQL no Oracle no qual está processando enquanto percorre o cursor e se algum erro (exceção) surgir, você não deseja abortar o processamento, mas deseja registrar o erro e continuar o em processamento.

Abaixo está o exemplo dado para lidar com tal condição, na qual criei duas seções de exceção, a primeira é para tratar o erro enquanto o loop do cursor e a outra é para tratar a exceção fora do loop do cursor.
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;