Исключения кидаются хотя файл читается корректно, я так понимаю только файл закрывается пока не найдет исключение. Как я могу это изменить?
CREATE OR REPLACE PROCEDURE APPS.toks_hcm_estructures (
p_errbuf OUT VARCHAR2,
p_linea OUT CLOB,
p_file_name IN VARCHAR2,
p_retcode OUT NUMBER)
AS
l_file UTL_FILE.FILE_TYPE;
v_line VARCHAR2 (32000);
my_arr v_arr1 := v_arr1 ();
v_path VARCHAR2 (100) := 'TOKS_HR_DIR_HDL';
ls_linea2 VARCHAR2 (32000);
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
p_errbuf := 'Error al generar archivo. No se Encontraron Datos.';
p_retcode := 1;
UTL_FILE.fclose (l_file);
WHEN UTL_FILE.INVALID_FILENAME
THEN
p_errbuf := 'Error. El archivo no existe.';
p_retcode := 1;
UTL_FILE.fclose (l_file);
WHEN UTL_FILE.read_error
THEN
p_errbuf := 'Error al generar archivo. Error de Lectura.';
p_retcode := 1;
UTL_FILE.fclose (l_file);
WHEN OTHERS
THEN
p_errbuf := 'Error paquete: ' || SQLERRM;
p_retcode := 1;
UTL_FILE.fclose (l_file);
END;
FOR i IN 1 .. my_arr.COUNT
LOOP
p_linea := p_linea || CHR (10) || my_arr (i);
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
p_errbuf := 'Error paquete: ' || SQLERRM;
p_retcode := 1;
UTL_FILE.fclose (l_file);
END toks_hcm_estructures;
/
Я думаю, было непонятно, что я пытаюсь сделать, так это то, что через исключения я могу проверить две вещи:
Что файл существует
Что файл не пустой





Выдается исключение когда вы читаете дальше конца файла:
If no text was read due to end of file, the
NO_DATA_FOUNDexception is raised.
так что вы вообще не хотите рассматривать это как ошибку. Однако в настоящее время вы игнорируете любую другую ошибку. Если вы собираетесь поймать 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
...
Если счетчик больше нуля, когда он выброшен, файл не был пустым.
Если файл не существует, вы получите ошибку файла, а не no_data_found — это чтение после конца существующего файла. И если файл пуст, то после этого цикла my_arr.COUNT будет равен нулю, поэтому вы можете проверить это явно и установить сообщение об ошибке.
и могу ли я ввести выходную переменную, когда my_arr.COUNT будет равен нулю?? Я пытаюсь сделать это, потому что мне нужны ошибки в выходных переменных, которые я затем буду использовать в другом инструменте, в котором я должен показывать статус чтения, и если статус был неполным, это показывает ошибку. Я не очень разбираюсь в PL/SQL, поэтому мне не все так ясно.
Да, это то, что я показал в своем редактировании. Последний подход может показаться вам самым простым - с IF внутри вашего существующего обработчика исключений....
Извините, Алекс, мне кажется, было непонятно, что я пытаюсь сделать. Я обновил пост немного более подробно и с процедурой, которую я сейчас использую.