Во всех операциях модуля UTL_FILE фигурирует понятие описателя файла. Описатель, или логический номер, файла (file handle) – это значение, которое используется в PL/SQL для идентификации файла, подобно идентификатору курсора в модуле DBMS_SQL. Все описатели файлов имеют тип UTL_FILE.FILE_TYPE, они возвращаются функцией FOPEN и передаются как параметры вида IN в другие подпрограммы UTL_FILE.
Функция FOPEN открывает файл на ввод или на вывод. В любой момент времени файл может быть открыт или только на ввод, или только на вывод. Описание FOPEN выглядит следующим образом:
function FOPEN (location in varchar2, filename in varchar2, open_mode in
varchar2);
return FILE_TYPE;
Каталог, путь к которому указывается, должен существовать на момент выполнения этой функции – FOPEN его не создает. Однако если установить режим OPEN_MODE как ‘w’, то существующий файл будет перезаписываться. Параметры и возвращаемое значение функции FOPEN описаны в следующей таблице:
Таблица 8 Параметры функции FOPEN
Параметр
Тип
Описание
location
varchar2
Путь к каталогу, в котором расположен файл. Если этот каталог не входит в число доступных, то устанавливается UTL_FILE.INVALID_PATH.
filename
varchar2
Имя открываемого файла. Если задан режим 'w', то существующий файл перезаписывается.
open_mode
varchar2
Используемый режим. Возможные значения: ‘r’ – чтение текста;
‘w’ – запись текста;
‘а’ – добавление текста.
Этот параметр не чувствителен к регистру символов. Если установлен режим ‘а’, а файл не существует, то он создается в режиме ‘w’.
Возвращаемое значение
UTL_FILE.FILE_TYPE
Описатель файла, используемый впоследствии в функциях.
В Oracle8 и выше в модуль UTL_FILE введен дополнительный, переопределенный вариант функции FOPEN:
function FOPEN (location in varchar2, filename in varchar2, open_mode in
varchar2, max_linesize in binary_integer);
return FILE_TYPE;
Параметры LOCATION, FILENAME и OPEN_MODE ведут себя так же, как и в первом варианте FOPEN, а MAXLINESIZE используется для указания максимального размера строки файла. Диапазон значений: от 1 до 32767. Если это значение не указано, максимальный размер строки устанавливается равным 1024. Если MAXLINESIZE меньше 1 или больше 32767, устанавливается исключительная ситуация UTL_FILE.INVALID_MAXLINESIZE.
После окончания чтения из файла или записи в него этот файл должен быть закрыт с помощью процедуры FCLOSE. В результате освобождаются ресурсы, используемые модулем UTL_FILE для работы с файлом. Описание FCLOSE выглядит следующим образом:
procedure FCLOSE (file_handle in out FILE_TYPE);
Единственным параметром этой процедуры является описатель файла. Все изменения, которые должны быть записаны в файл, завершаются перед его закрытием. В случае ошибки записи устанавливается UTL_FILE.WRITE_ERROR. Если описатель не идентифицирует корректный открытый файл, то устанавливается UTL_FILE.INVALID_FILEHANDLE.
Зачастую, перед тем как производить операции чтения из файла или записи/перезаписи в файл полезно проверить, открыт ли этот файл. Для этих целей в модуле UTL_FILE предусмотрена функция IS_OPEN. Эта логическая функция возвращает TRUE, если указанный файл открыт, и FALSE, если не открыт. Описание функции IS_OPEN таково:
function IS OPEN (file_handle in FILE TYPE)
return boolean;
Даже в том случае, когда IS_OPEN возвращает TRUE, при работе с данным файлом могут происходить ошибки операционной системы.
Процедура FCLOSE_ALL модуля UTL_FILE закрывает все открытые файлы. Она предназначена для удаления ставшей ненужной информации, что особенно полезно в обработчиках исключительных ситуаций:
procedure FCLOSE_ALL;
Эта процедура не принимает никаких аргументов. Все ожидающие записи изменения сбрасываются на диск перед закрытием файлов. Поэтому в случае ошибки записи FCLOSE_ALL может устанавливать исключительную ситуацию UTL_FILE.WRITE_ERROR.