抛出异常 当你读过文件的末尾时 :
如果由于文件结尾没有读取文本,则 NO_DATA_FOUND 提出异常。
NO_DATA_FOUND
所以你根本不想把它视为一个错误。您目前正在忽略任何其他错误。如果你要赶上 OTHERS 你应该在结束后重新投掷:
OTHERS
... BEGIN l_file := UTL_FILE.FOPEN(v_path, p_file_name, 'R',32767); BEGIN LOOP UTL_FILE.GET_LINE (v_file, v_line); my_arr.EXTEND; my_arr (my_arr.COUNT) := v_line; END LOOP; EXCEPTION WHEN no_data_found THEN --p_errbuf := 'Error de lectura. No se Encontraron Datos.'; --p_retcode := 1; UTL_FILE.FCLOSE (v_file); WHEN OTHERS THEN UTL_FILE.FCLOSE (v_file); RAISE; -- re-throw exception so it is reported END; UTL_FILE.FCLOSE (v_file); ...
或者(在编辑之后)如果每个异常处理程序都设置了一条消息但是没有提前返回 - 也许它们应该? - 您只需要在该子块结束后关闭单个。我补充说,因为您的原始代码在出错时关闭了文件,但没有成功。
就Oracle而言,文件为空不是错误条件,因此您不会为此获得异常。但是如果文件是空的那么 my_arr.COUNT 循环后仍然为零,因此您可以测试:
my_arr.COUNT
... END; IF my_arr.COUNT = 0 THEN p_errbuf := 'Error al generar archivo. No se Encontraron Datos.'; p_retcode := 1; END IF; FOR i IN 1..my_arr.COUNT LOOP ...
循环之后(或者,真的;无论如何,第二个循环在该场景中什么都不做)。该文件现在已经关闭。
或者,如果您愿意,请保留原始代码,但在看到异常时检查计数:
... BEGIN l_file := UTL_FILE.FOPEN(v_path, p_file_name, 'R',32767); BEGIN LOOP UTL_FILE.GET_LINE(l_file, v_line); my_arr.EXTEND; my_arr(my_arr.COUNT) := v_line; END LOOP; EXCEPTION WHEN no_data_found THEN IF arr.COUNT = 0 THEN p_errbuf := 'Error al generar archivo. No se Encontraron Datos.'; p_retcode := 1; END IF; UTL_FILE.FCLOSE (v_file); WHEN UTL_FILE.INVALID_FILENAME THEN ...
如果计数在抛出时大于零,则文件不为空。