Исключение выдается при чтении после конца файла :
Если текст не был прочитан из-за конца файла, возникает исключение NO_DATA_FOUND
.
, поэтому вы не хотите, чтобы это воспринималось как ошибка.Вы в настоящее время игнорируете любую другую ошибку, хотя.Если вы собираетесь поймать 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
все равно будет нулем после цикла, поэтому вы можете проверить это:
...
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
...
Если счет больше нуля, когдаон выбрасывается, то файл не был пустым.