Есть папка (локально) С:\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<
В 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.
Комментариев нет:
Отправить комментарий