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

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


1752 Приложение А

Для решения этой проблемы необходимо использовать пакет UTL FILE так, как это делалось в представленной выше процедуре DUMP PAGE. Четвертый параметр вызова функции UTL FILE.FOPEN задает максимальную длину строки текста, которую предполагается использовать. Я допускал использование строк длиной до 32000 байт.

Чтение содержимого каталога

Этой возможности в пакете UTL FILE не хватает. Часто необходимо создать периодически выполняющееся задание для просмотра каталога в поисках новых файлов и обработки этих файлов, например загрузки их содержимого в базу данных. К сожалению, стандартного способа прочитать список файлов в каталоге в языке PL/SQL нет. Можно, однако, реализовать эту возможность с помощью небольшого фрагмента кода на языке Java. Следующий пример демонстрирует, как это сделать.

Сначала я создам пользователя с минимальным набором привилегий, необходимых для выполнения действий по загрузке данных и получения списка файлов в каталоге /tmp. Если необходимо читать содержимое других каталогов, придется добавить соответствующие вызовы dbmsJava.grant permission (подробнее о них см. в главе 19) или заменить /tmp на *, что позволит получить список файлов любого каталога.

SQL> connect system/manager

system@DEV816> drop user dirlist cascade; User dropped.

system@DEV816> grant create session, create table, create procedure

2 to dirlist identified by dirlist; Grant succeeded.

system@DEV816> begin

2 dbms java.grant permission

3 (DIRLIST,

4 java.io.FilePermission,

5 /tmp,

6 read);

7 end;

PL/SQL procedure successfully completed.

Затем, подключившись от имени пользователя DirList, мы создаем глобальную временную таблицу в его схеме (для хранения списка файлов каталога). Так, через временную таблицу, мы сможем получить результаты выполнения хранимой процедуры на языке Java в вызывающей среде. Можно использовать для этого и другие способы (строки, массивы и т.п.).

SQL> connect dirlist/dirlist Connected.

dirlist@DEV816> create global temporary table DIR LIST

2 (filename varchar2(255))

3 on commit delete rows

4 / Table created.



Пакет UTL FILE

1753

Теперь создадим хранимую процедуру на языке Java получения списка файлов в указанном каталоге. Чтобы упростить программирование, я использую средства препроцессора SQLJ - это позволяет избежать написания большого количества вызовов JDBC:

dirlist@DEV816> create or

7 8 9

10 11 12 13 14 15 16 17 18 19 20 21

22 23

24 25

replace source named

DirList

and compile java as

import java.io.*; import java.sql.*;

public class DirList {

public static void getList(String directory) throws SQLException

File path = new File(directory); String[] list = path.list(); String element;

for {

(int i = 0; i < list.length; element = list[i];

#sql { INSERT INTO DIR LIST (FILENAME) VALUES (:element) } ;

Java created.

Затем необходимо создать процедуру сопоставления, связывающую языки PL/SQL и Java. Она достаточно проста:

in varchar2)

dirlisteDEV816> create or replace

2 procedure get dir list(p directory

3 as language java

4 name DirList.getList(java.lang.String);

Procedure created.

Теперь можно использовать процедуру get dir list:

dirlist@DEV816> exec get dir list(\tmp); PL/SQL procedure successfully completed. dirlist@DEV816> select * from dir list where rownum

FILENAME

< 5;

lost+found .rpc door

ps data .pcmcia



1754 Приложение

Вот и все. В соответствующей временной таблице теперь можно получить список файлов каталога. К данным таблицы можно применять фильтры, например LIKE, или сортировать результаты.

Резюме

Пакет UTL FILE - замечательная утилита, которая пригодится во многих приложениях. В этом разделе мы рассмотрели как настроить сервер для использования средств пакета UTL FILE, и описали особенности его работы. Мы рассмотрели наиболее часто возникающие проблемы при использовании пакета UTL FILE, в частности обращение к сетевым дискам в среде Windows, ограничение длины строки 1023 байтами, и обработку исключительных ситуаций. Для каждой из этих проблем были представлены решения. Мы также изучили ряд утилит, которые можно создать с помощью пакета UTL FILE, в частности процедуру UNLOADER, описанную в главе 9, средства чтения списка файлов каталога и сброса Web-страницы на диск.



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

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