Estou tentando lidar com duas exceções diferentes que podem ser acionadas em uma tabela externa que lê um CSV.
O código funciona muito bem, mas estou preocupado em estar fazendo errado.
SET SERVEROUTPUT ON;
DECLARE
records INT := 0;
external_table EXCEPTION;
PRAGMA EXCEPTION_INIT(external_table, -29913);
BEGIN
SELECT COUNT(*) INTO records FROM ext_testing;
EXCEPTION
WHEN external_table THEN
IF dbms_utility.format_error_stack LIKE '%KUP-04040%' THEN
RAISE_APPLICATION_ERROR(-20000, 'Missing CSV file!');
ELSIF dbms_utility.format_error_stack LIKE '%ORA-30653%' THEN
raise_application_error(-20001, 'Invalid UTI report, check for missing fields!');
END IF;
WHEN others THEN
dbms_output.put_line('An exception occurred');
dbms_output.put_line(SQLCODE || '=>' || SQLERRM);
END;
Sugiro duas pequenas modificações:
WHEN OTHERS
manipulador de exceção. Não levantar a exceção fará com que o aplicativo de chamada pense que o procedimento foi bem-sucedido. Ou, melhor ainda, não useWHEN OTHERS
: não há sentido em capturar uma exceção se você não fizer nada além de reaumentá-la. Deixe a exceção natural borbulhar.ELSE
cláusula no primeiro manipulador de exceção apenas para ter certeza de não ignorar silenciosamente um novo tipo de erro que não é detectado pelas duasIF
condições.Além disso, não vejo nada de errado em usar
dbms_utility.format_error_stack
em uma cláusula de exceção (na verdade, você não pode usá-la em nenhum outro lugar).