Программирование >>  Oracle 

1 ... 439 440 441 [ 442 ] 443 444 445 ... 469


Пакет UTL FILE 1749

ется служба, настроил диск, указанный в значении параметра UTL FILE DIR, и был зарегистрирован на сервере при использовании пакета UTL FILE.

С помощью универсальн1х соглашений по именованию. Использование универсальных соглашений по именованию (Universal Naming Conventions - UNC) предпочтительнее сопоставления дисков, поскольку не требует регистрации пользователя. При этом значение параметра инициализации UTL FILE DIR задается в виде \\<имя машин1 >\<имя общего ресурса >\<путь .

Естественно, сервер Oracle после изменения свойств сетевой службы необходимо перезапустить.

Обработка исключительных ситуаций

При возникновении ошибки пакет UTL FILE возбуждает исключительную ситуацию. К сожалению, он возбуждает исключительные ситуации, задаваемые пользователем, - они определены в спецификации пакета. Если эти исключительные ситуации не перехвачены по имени, выдаются совершенно бесполезные сообщения об ошибках:

ERROR at line 1:

ORA-06510: PL/SQL:unhandleduser-defined exception ORA-06512: at SYS.UTL FILE , line 98 ORA-06512: at SYS.UTL FILE , line 157

О самой ошибке в этом сообщении ничего не сказано. Для решения этой проблемы надо включить обращения к пакету UTL FILE в блок обработки исключительных ситуаций, где каждая из них перехватывается по имени. Я предпочитаю преобразовывать исключительные ситуации в вызовы процедуры RAISE APPLICATION ERROR. Это позволяет задать код ошибки ORA- и выдать более информативное сообщение об ошибке. В предыдущем примере мы использовали этот прием для преобразования представленного выше сообщения об ошибке в следующее:

ORA-20001: INVALID PATH: File location or filename was invalid.

Это сообщение намного полезнее. Я всегда использую блок обработки исключитель-н1х ситуаций следующего вида:*

exception

when utl file.invalid path then

raise application error(-20001, - ошибка в имени файла INVALID PATH: File location or filename was invalid.) ; when utl file.invalid mode then

raise application error(-20002, - недостимое значение режима -> открытия файла

INVALID MODE: The open mode parameter in FOPEN was invalid.); whenutl file.invalid filehandlethen

raise application error(-2 0 0 02, - недостим1й дескриптор файла INVALID FILEHANDLE: The file handle was invalid.) ;

* Исходные сообщения об ошибках приводятся на английском, а в строке с кодом ошибки добавлен комментарий на русском языке с описанием причины ее возникновения. - Прим. научн. ред.



1750

Приложение А

when utl file.invalid operation then

raise application error(-20003, - файл нельзя открыть или -> обработать в указанном режиме

INVALID OPERATION: The file could not be opened or operated on as requested.) ; when utl file.read error then

raise application error(-20004, - в ходе чтения произошла ошибка -> операционной системы

READ ERROR: An operating system error occurred during the read operation.) ; when utl file.write error then

raise application error(-20005, - в ходе записи произошла ошибка -> операционной системы

WRITE ERROR: An operating system error occurred during the write operation.) ; when utl file.internal error then

raise application error(-20006, - неизвестная ошибка в PL/SQL INTERNAL ERROR: An unspecified error in PL/SQL.) ;

end;

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

Как сбросить Web-страницу на диск?

Этот вопрос задают так часто, что я решил дать ответ здесь. Предполагается, что используется Oracle WebDB, Oracle Portal или другие процедуры на базе средств Web Toolkit (пакетов htp). Хотелось бы не генерировать динамически отчет, который можно получить с помощью этих средств, отдельно каждого пользователя, а периодически, один раз в X часов или минут, создавать статический файл с отчетом. Именно так я и генерирую начальную страницу на своем сайте. Вместо того чтобы генерировать ее динамически для каждого из тысяч поступающих за этот период обращений, раз в 5 минут я генерирую статическую начальную страницу заново на основе динамических данных. Это существенно сокращает ресурсы, необходимые для поддержки сайта. Такой прием я применяю для популярных динамических станиц, базовые данные которых меняются сравнительно редко.

Ниже представлена универсальная процедура, которую я этого использую:

create or replace procedure dump page(p dir in varchar2,

p fname in varchar2)

l thePage htp.htbuf arr;

l output utl file.file type;

l lines number default 99999999;

begin

l output := utl file.fopen(p dir, p fname, w, 32000); owa.get page(l thePage, l lines); for i in 1 .. l lines loop



Пакет UTL FILE 1751

utl file.put(l output, l thePage(i)); end loop;

utl file.fclose(l output); end dump page; /

Все очень просто. Необходимо открыть файл, получить HTML-страницу, выдать каждую ее строку в файл и закрыть его. Если вызвать эту процедуру после WebDB-npo-цедуры, она сохранит результат работы WebDB-процедуры в заданном файле.

Единственная проблема при использовании этого подхода состоит в том, что WebDB-процедура выполняется непосредственно, а не через Web. Если в коде WebDB-процеду-ры используется среда CGI, эта процедура не выполнится, поскольку среда не настроена. Для решения этой проблемы достаточно использовать небольшой фрагмент кода для настройки среды:

declare

nm owa.vc arr;

vl owa.vc arr; begin

nm(l) := SERVER PORT; vl(l) := 80;

owa.init cgi env(nm.count, nm, vl);

- здесь выполните необходимую webdb-процеру

dump page(directory, filename);

end;

Например, если WebDB-процедура проверяет, запущена ли она с порта 80 на сервере, надо создать для нее соответствующую среду. В этом блоке надо задать и все остальные переменные среды, существенные для приложения.

Теперь осталось только перечитать раздел, посвященный пакету DBMS JOB, и обеспечить периодическое выполнение этого блока кода.

Ограничение длины строки - 1023 байт

Когда-то у пакета UTL FILE было ограничение длины записываемой в файл строки: не более 1023 байт. В противном случае возбуждалась исключительная ситуация, и процедура пакета UTL FILE не выполнялась. К счастью, в версии Oracle 8.0.5 добавлена новая версия функции FOPEN, позволяющая при открытии файла задавать макси-мальнуюдлину строки вплоть до 32 Кбайт. 32 Кбайт - максимальный размер переменной в PL/SQL, и такой длины в большинстве случаев хватает.

К сожалению, в документации эта перегруженная версия функции FOPEN описана через несколько страниц после исходной функции. Поэтому многие пользователи об этой возможности и не подозревают. Я по-прежнему получаю много вопросов об этом, хотя сейчас используются версии, начиная с 8.1.7. Пользователя не замечают перегруженную версию функции FOPEN; они сталкиваются с ограничением и ищут способы обойти его. Ответ простой, но, чтобы найти его, надо прочитать описание всех функций пакета UTL FILE!



1 ... 439 440 441 [ 442 ] 443 444 445 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика