|
Программирование >> Oracle
Пакет 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!
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |