Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СУБД.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
6.32 Mб
Скачать

Исключительные ситуации, устанавливаемые в utl_file

Если при выполнении некоторой процедуры или функции модуля UTL_FILE возникает ошибка, устанавливается исключительная ситуация. Возможные исключительные ситуации приведены в таблице 7. Обратите внимание на то, что в их состав входят восемь определенных в модуле UTL_FILE и две стандартные исключительные ситуации (NO_DАТА_FOUND и VALUE_ERROR). Исключительные ситуации UTL_FILЕ можно распознать по имени или с помощью обработчика исключительной ситуации OTHERS. Стандартные исключительные ситуации определяются еще и по значениям, возвращаемым для них функцией SQLCODE.

Таблица 7 Исключительные ситуации, устанавливаемые в UTL_FILE

Исключительная ситуация

Причина

Источник

1

2

3

INVALID_РАТH

Имя каталога или имя файла неверно или недоступно

FOPEN

INVALID_MODE

Для режима файла указана неверная строка символов

FOPEN

INVALID_FILE_HANDLE

Описатель файла не указывает на открытый файл

FCLOSE, GET_LINE, PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH

Продолжение таблицы 7

1

2

3

INVALID_OPERATION

Файл нельзя открыть так, как это было запрошено. Возможная причина – полномочия операционной системы. Устанавливается также при попытке записи в файл, открытого для чтения, или при попытке чтения файла, открытого для записи

GET_LINE, PUT, PUT_LINE, NEW_LINE, PUTF, FFLUSH

INVALID_MAXLINESIZE

Указанный максимальный размер строки слишком велик или слишком мал.

FOPEN

READ_ERROR

Ошибка операционной системы во время операции чтения

GET_LINE

WRITE ERROR

Ошибка операционной системы во время операции записи

PUT, PUT_LINE, PUTF, NEW_LINE, FFLUSH, FCLOSE, FCLOSE_АLL

INTERNAL_ERROR

Неопределенная внутрисистемная ошибка

Все функции

NO_DATA_FOUND

Во время чтения достигнут конец файла

GET_LINE

VALUE_ERROR

Вводимая строка слишком велика для буфера, указанного в GET_LINE

GET_LINE

Открытие и закрытие файлов

Во всех операциях модуля 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.