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'));