Как скопировать/прочитать файл с удалённого сервера?

У меня есть сервер с приложением и сервер БД. Приложение размещает на своём сервере файл. Нужно его прочитать с сервера БД.

Из того, что нашёл это DBMS_FILE_TRANSFER.GET_FILE, но чтобы взять файл с удалённого сервера, на нём должна быть установленна БД.

Или с помощью DBMS_SCHEDULER выполнить команду cmd, чтобы скопировать файл с удалённого сервера, но это решение, мне кажется, не очень.


Ответы (1 шт):

Автор решения: 0xdb

Как один из вариантов решения:

  • сделать каталог с файлами на сервере приложений общим
  • смонтировать его на сервере БД
  • создать объект директории и читать оттуда файлы в PL/SQL блоке

Например, смонтировал сетевой каталог //wincomputer/appshare под /mnt/share/, и далее:

create directory appshare as '/mnt/share'
/
Directory APPSHARE created.

Для чтения списка файлов воспользовался этим решением, заменив имена таблицы и каталога на appfiles и appshare соответственно. Создал новый файл на Windows машине:

D:\> echo abc123 >appshare\appfile_123.txt

, и прочёл его на сервере БД:

SQL> col filename new_value filename
SQL> select *
     from appfiles where filename like 'appfile%';

FILENAME
--------------------------------------------------------------------------------
appfile_123.txt

set autoprint 
var rc refcursor
declare
    f utl_file.file_type;
    buff varchar2 (128);
begin
    f := utl_file.fopen (upper ('appshare'), '&filename', 'r');
    utl_file.get_line (f, buff);
    utl_file.fclose (f); 
    open :rc for 
        select '&filename'||' contains >>'||buff||'<<' result from dual;
end;
/

Результат:

RESULT
-----------------------------------
appfile_123.txt contains >>abc123 
<< 
→ Ссылка