我正在尝试处理两个不同的异常,这些异常可能会在读取 CSV 的外部表中触发。
代码运行良好,但我担心我做错了。
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;
我会建议两个小的修改:
WHEN OTHERS
在异常处理程序中重新引发异常。不引发异常将使调用应用程序认为该过程确实成功了。或者最好不要使用WHEN OTHERS
:如果除了重新引发异常什么都不做,那么捕获异常是没有意义的。让自然异常冒泡。ELSE
子句只是为了确保您不会默默地忽略未被这两个IF
条件捕获的新型错误。除此之外,我认为
dbms_utility.format_error_stack
在异常子句中使用没有任何问题(事实上,您不能在其他任何地方使用它)。