Я пытался загрузить данные в БД при запуске приложения.
С H2 я использовал приведенный ниже запрос, и он работал отлично. С Oracle это не работает. Может ли кто-нибудь указать мне правильное направление? Я просмотрел документацию оракула, но не смог найти эквивалент.
INSERT INTO TEMPLATES(ID,NAME,BODY) VALUES('2b04469f31c445ca82c354322845b52b', 'Records', FILE_READ('/opt/bin/Records.txt'));
Я понял от этого вопроса, что H" file-read()
возвращает блоб. Пожалуйста, уточните свой вопрос, если это не так.
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'));
Какой тип данных у
templates.body
? Это BLOB? БФАЙЛ? КЛОБ?