Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

Получить имена всех файлов в папке на PL/SQL (Oracle XE)

Есть папка (локально) С:\LB в которую некто закидывает файлы. Мне необходимо (периодически, через определенное время) получать имена всех этих файлов, и если в этих именах есть то имя, которое мне надо, я цепляю этот файл (.PDF) к определенной записи в таблице.
Пока я работаю над получением списка имен файлов:
create global temporary table DIR_LIST (filename varchar2(255)) on commit delete rows; /
create or replace and compile java source named "DirList" 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; i++) { element = list[i]; #sql { INSERT INTO DIR_LIST (FILENAME) VALUES (:element) }; } } } /
create or replace procedure get_dir_list( p_directory in varchar2 ) as language java name 'DirList.getList( java.lang.String )';
БД 11g XE и я не могу развернуть JAVA внутри. Писать внешний JAR-ник не совсем актуально. Я так понимаю нужен шедулер и JOB, но все форумы говорят что на чистом PL/SQL этого (получить имена файлов и превратить их в таблицу) написать нельзя. Ок. Возможно можно развернуть .NET классы внутри БД, обернув в процедуру? Как с классами JAVA. Уверен, кто-то определенно с этим сталкивался. Буду благодарен за подсказки!


Ответ

Можно с помощью внешних таблиц реализовать:
mkdir /tmp/stage
cat >/tmp/stage/readdir.sh<for i in {1..5}; do touch /tmp/stage/invoice_no_$RANDOM.pdf; done
В sqlplus:
create or replace directory stagedir as '/tmp/stage'; --Directory STAGEDIR created.
create table files (filename varchar2(255)) organization external ( type oracle_loader default directory stagedir access parameters ( records delimited by newline preprocessor stagedir:'readdir.sh' fields terminated by "|" ldrtrim ) location ('readdir.sh') ); / --Table FILES created.
select * from files;
FILENAME -------------------------------------------------------------------------------- FILES_27463.log invoice_no_20891.pdf invoice_no_2255.pdf invoice_no_24086.pdf invoice_no_30372.pdf invoice_no_8340.pdf readdir.sh
7 rows selected
Можно также с разовым job, но это решение будет явно потяжелей, т.к. стандртный вывод нельзя на прямую вернуть в вызывающую процедуру. Зато, как клиент пожелал, всё будет в pl/sql.

Комментариев нет:

Отправить комментарий