Работа с файлами операционной системы - пакет UTL_FILE

Замечательный пакет UTL_FILE в СУБД Oracle позволяет легко записывать и читать файлы операционной системы. Пакет UTL_FILE предлагает сокращенную версию стандартного потокового ввода-вывода операционной системы. Процедуры и функции пакета UTL_FILE дают возможность открывать, читать, писать и закрывать файлы операционной системы. Oracle также использует пакет текстового ввода-вывода клиентской стороны по имени TEXT_IO как часть Oracle Procedure Builder.

Использование пакета UTL_FILE

Пакет UTL_FILE  СУБД Oracle легко использовать для чтения и записи файлов операционной системы. Во многих случаях, когда нужно создавать отчеты, пакет UTL_FILE оказывается идеальным средством создания файла, который затем можно отправить куда-нибудь с помощью утилиты FTP. Далее в статье блога мы ознакомимся с простым примером, иллюстрирующим использование этого пакета.

Создание каталога файлов

Первый шаг в использовании пакета UTL_FILE — создание каталога, куда будут помещаться файлы операционной системы. Для этой цели создается специальный каталог:

SQL> CREATE DIRECTORY utl_dir AS '/u50/oradata/archive_data';
/* каталог может быть назван как угодно - utl_dir выбрано просто для примера*/
Directory created.
SQL> 

Совет. Инициализационный параметр UTL_FILE_DIR все еще остается в силе, но в Oracle отныне не рекомендуют им пользоваться. Вместо этого рекомендуется применять команду CREATE DIRECTORY. Использование подхода на основе этой команды лучше, потому что не приходится перезапускать базу данных, как при добавлении параметра UTL_FILE_DIR.


Выдача привилегий пользователям

Вы должны выдать пользователям привилегии для чтения и записи файлов в только что созданный каталог utl_dir с помощью следующей команды:

SQL> GRANT READ, WRITE ON DIRECTORY utl_dir to public;
Grant succeeded.
SQL> 

Процедуры и функции UTL_FILE

Пакет UTL_FILE использует множество своих процедур и функций для выполнения файловых манипуляций и действий по записи и чтению текста. В следующем разделе кратко рассматриваются ключевые процедуры и функции пакета UTL_FILE.


На заметку! UTL_FILE.FILE_TYPE — тип данных для обработки файлов, который используется во всех процедурах и функциях пакета UTL_FILE. Как вы вскоре убедитесь, при каждом применении пакета UTL_FILE внутри анонимного блока кода PL/SQL или внутри процедуры первым делом нужно объявить дескриптор файла типа UTL_FILE.FILE_TYPE.


Открытие файла операционной системы

Функция FEOPEN служит для открытия файла операционной системы для ввода и вывода. Файл можно открывать в трех режимах: чтение (r), запись (w) или добавление (a).

Чтение из файла

Чтобы выполнить чтение файла, сначала при открытии файла функцией FOPEN специфицируется режим чтения (r). Процедура GET_FILE позволяет читать по одной строке текста за раз из указанного файла операционной системы.

Запись в файл

Чтобы осуществить запись в файл, он должен быть открыт в режиме записи (w) или добавления (a). В режиме добавления (a) осуществляется дописывание в файл, а в режиме записи (w) — перезапись файла, если он уже существует. Если файл не существует в каталоге UTL_FILE, то утилита UTL_FILE сначала создаст и затем выполнит запись в него. Обратите внимание, что создавать файл вручную не придется — об этом позаботится функция FOPEN.

Для записи строки в файл применяется процедура PUT. После того, как пакет выполнит запись в файл, можно произвести переход к следующей строке с помощью процедуры NEW_LINE. Однако для записи в текстовый файл лучше использовать процедуру PUT_LINE, которая работает как комбинация PUT и NEW_LINE.

Закрытие файла

После завершения чтения или записи файла необходимо с помощью процедуры FCLOSE закрыть файл операционной системы. Если открыто более одного файла, можно применить процедуру FCLOSE_ALL, чтобы закрыть их все сразу.

Исключения

Всякий раз, когда вы используете пакет UTL_FILE в процедуре или блоке PL/SQL, не забудьте в конец добавить блок обработки исключений, чтобы перехватывать все возможные ошибки, которые могут возникнуть. Например, местоположение каталога может быть неверным, или же в процедуре возникнет ошибка “no data found” (“данные не найдены”). Ошибки чтения и записи происходят по множеству причин. Пакет UTL_FILE включает в себя множество предопределенных исключений, и рекомендуется применять все эти исключения в конце процедуры или блока кода, чтобы облегчить отладку.В случае использования RAISE_APPLICATION_ERROR для связывания номера ошибки и сообщения с исключением будет намного легче отлаживать код.

Простой пример использования пакета UTL_FILE

Следующий анонимный код PL/SQL применяет пакет UTL_FILE для записи информации, связанной с паролем, с использованием представлений словаря данных DBA_USERS и DBA_PROFILES. Цель состоит в создании файла операционной системы со списком имен пользователей, максимальным количеством разрешенных попыток регистрации, длительностью действия и временем блокировки паролей. Этот блок кода приведен в листинге 6.12.


SQL> DECLARE
v_failed dba_profiles.limit%TYPE;
v_lock dba_profiles.limit%TYPE;
v_reuse dba_profiles.limit%TYPE;
/* fHandle используется при каждом открытии
файла операционной системы /*
fHandle UTL_FILE.FILE_TYPE;
vText VARCHAR2(10);
v_username dba_users.username%TYPE;
CURSOR users IS
SELECT username FROM dba_users;
BEGIN
/* Открыть файл utlfile.txt для записи и получить его файловый дескриптор */
fHandle := UTL_FILE.FOPEN('/a01/pas/pasp/import','utlfile.txt','w');
/* Записать строку текста в файл utlfile.txt */
UTL_FILE.PUT_LINE(fHandle,'USERNAME'||'ATTEMPTS'||'LIFE'||'LOCK'||);
/* Закрыть файл utlfile.txt */
UTL_FILE.FCLOSE(fHandle);
/* Открыть файл utlfile.txt для записи и получить его файловый дескриптор */
fHandle := UTL_FILE.FOPEN('/a01/pas/pasp/import','utlfile.txt','a');
OPEN users;
LOOP
FETCH users INTO v_username;
EXIT when users%NOTFOUND;
SELECT p.limit
INTO v_failed
FROM dba_profiles p, dba_users u
WHERE p.resource_name='FAILED_LOGIN_ATTEMPTS'
AND p.profile=u.profile
AND u.username=v_username;
SELECT p.limit
INTO v_life
FROM dba_profiles p, dba_users u
WHERE p.resource_name='PASSWORD_LIFE_TIME'
AND p.profile=u.profile
AND u.username=v_username;
SELECT p.limit
INTO v_lock
FROM dba_profiles p, dba_users u
WHERE p.resource_name='PASSWORD_LOCK_TIME'
AND p.profile=u.profile
AND u.username=v_username;
vtext :='TEST';
/* Записать строку текста в файл utlfile.txt */
UTL_FILE.PUT_LINE(fHandle,v_username||v_failed||_life||v_lock);
/* Прочитать строку из файла utltext.txt */
UTL_FILE.GET_LINE(fHandle,v_username||v_failed||v_life||v_lock);
/* Вывести строку текста на экран */
UTL_FILE.PUT_LINE(v_username||_failed||v_life||v_lock);
END LOOP;
CLOSE users;
/* Закрыть файл utlfile.txt */
UTL_FILE.FCLOSE(fHandle);
/* Блок обработки исключений для ошибок UTL_File */
EXCEPTION
WHEN UTL_FILE.INVALID_PATH THEN
RAISE_APPLICATION_ERROR(-20100,'Неверный путь');
WHEN UTL_FILE.INVALID_MODE THEN
RAISE_APPLICATION_ERROR(-20101,'Неверный режим');
WHEN UTL_FILE.INVALID_OPERATION then
RAISE_APPLICATION_ERROR(-20102,'Неверная операция');
WHEN UTL_FILE.INVALID_FILEHANDLE then
RAISE_APPLICATION_ERROR(-20103,'Неверный файловый дескриптор');
WHEN UTL_FILE.WRITE_ERROR then
RAISE_APPLICATION_ERROR(-20104,'Ошибка записи');
WHEN UTL_FILE.READ_ERROR then
RAISE_APPLICATION_ERROR(-20105,'Ошибка чтения');
WHEN UTL_FILE.INTERNAL_ERROR then
RAISE_APPLICATION_ERROR(-20106,'Внутренняя ошибка');
WHEN OTHERS THEN
UTL_FILE.FCLOSE(fHandle);
END; 

 

Вас заинтересует / Intresting for you:

Запись в бд oracle (DBWr)
Запись в бд oracle (DBWr) 6386 просмотров Боба Tue, 24 Nov 2020, 07:10:36
Oracle alerts: генерируемые се...
Oracle alerts: генерируемые се... 4480 просмотров Алексей Вятский Tue, 21 Nov 2017, 13:18:05
ALTER TABLE: команда изменения...
ALTER TABLE: команда изменения... 4561 просмотров Ирина Глебова Sat, 02 Nov 2019, 15:59:16
Создание таблиц  в базе данных...
Создание таблиц в базе данных... 6036 просмотров Administrator SU Mon, 28 Oct 2019, 08:20:14
Войдите чтобы комментировать