Есть ли в оракуле эквивалент FILE_READ? - PullRequest
1 голос
/ 21 мая 2019

Я пытался загрузить данные в БД при запуске приложения.

С H2 я использовал следующий запрос, и он работал отлично. С Oracle это не работает. Может кто-нибудь указать мне правильное направление? Я просмотрел документацию оракула, но не смог найти эквивалент.

INSERT INTO TEMPLATES(ID,NAME,BODY) VALUES('2b04469f31c445ca82c354322845b52b', 'Records', FILE_READ('/opt/bin/Records.txt'));

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Oracle SQL не имеет эквивалента функции file_read(). Тем не менее, можно написать свой собственный.

Однако, прежде чем мы начнем, вы должны знать, что Oracle гораздо более заблокирован, когда речь заходит о совместимости базы данных с ОС. Многие функции не включены по умолчанию, и, следовательно, вам может потребоваться помощь дружественного администратора базы данных, чтобы это заработало.

Например, мы не можем напрямую использовать пути к файлам ОС (по крайней мере, в более поздних версиях), поэтому нам нужно создать объект DIRECTORY. Обычно привилегия делать это ограничена администраторами баз данных.

create directory opt_bin as '/opt/bin';
grant read on directory opt_bin to <<your_user>>;

Обратите внимание, что /opt/bin должен быть каталогом, к которому у базы данных есть доступ. В среде * nix это означает, что пользователь ОС oracle имеет по крайней мере read в каталоге.

Имея эту инфраструктуру, мы можем создать функцию, которая загружает файл ОС в большой двоичный объект. Он использует каталог и имя файла для создания экземпляра BFILE, а затем применяет возможность DBMS_LOB для загрузки этого BFILE в BLOB.

create or replace file_to_blob 
    (p_dir in varchar2, p_file in varchar2)
    return blob
is
    bf bfile;
    tmp_blob blob := empty_blob();
    l_dest_offset pls_integer := 1;
    l_src_offset pls_integer := 1;
begin
    bf := bfilename(p_dir, b_file);
    dbms_lob.createtemporary(tmp_blob, true);
    dbms_open(bf, dbms_lob.file_readonly);
    dbms_lob.loadblobfromfile(tmp_blob, bf, dbms_lob.lobmaxsize, l_dest_offset, l_src_offset);
    dbms_lob.close(bf);
    return tmp_blob;
end;
/

Вы можете использовать эту функцию в своем выражении вставки следующим образом:

INSERT INTO TEMPLATES(ID,NAME,BODY) 
VALUES
('2b04469f31c445ca82c354322845b52b', 'Records', file_to_blob('opt_bin', 'Records.txt'));
0 голосов
/ 21 мая 2019

Я думаю, что вы ищете utl_file.fopen

Но это утилита PL / SQL.Что ты пытаешься сделать?Ваш файл считывается один раз?

подробнее: https://docs.oracle.com/cd/F49540_01/DOC/server.815/a68001/utl_file.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...