Oracle получить список файлов в директории
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.
2 dbms java.grant permission
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.
Теперь создадим хранимую процедуру на языке Java получения списка файлов в указанном каталоге. Чтобы упростить программирование, я использую средства препроцессора SQLJ - это позволяет избежать написания большого количества вызовов JDBC:
dirlist@DEV816> create or
10 11 12 13 14 15 16 17 18 19 20 21
replace source named
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;
(int i = 0; i < list.length; element = list[i];
Затем необходимо создать процедуру сопоставления, связывающую языки PL/SQL и Java. Она достаточно проста:
dirlisteDEV816> create or replace
2 procedure get dir list(p directory
3 as language java
4 name DirList.getList(java.lang.String);
Теперь можно использовать процедуру get dir list:
dirlist@DEV816> exec get dir list(\tmp); PL/SQL procedure successfully completed. dirlist@DEV816> select * from dir list where rownum
lost+found .rpc door
Вот и все. В соответствующей временной таблице теперь можно получить список файлов каталога. К данным таблицы можно применять фильтры, например LIKE, или сортировать результаты.
Пакет UTL FILE - замечательная утилита, которая пригодится во многих приложениях. В этом разделе мы рассмотрели как настроить сервер для использования средств пакета UTL FILE, и описали особенности его работы. Мы рассмотрели наиболее часто возникающие проблемы при использовании пакета UTL FILE, в частности обращение к сетевым дискам в среде Windows, ограничение длины строки 1023 байтами, и обработку исключительных ситуаций. Для каждой из этих проблем были представлены решения. Мы также изучили ряд утилит, которые можно создать с помощью пакета UTL FILE, в частности процедуру UNLOADER, описанную в главе 9, средства чтения списка файлов каталога и сброса Web-страницы на диск.
Читайте также: