Есть ли эквивалент FILE_READ в оракуле?

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

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

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

Какой тип данных у templates.body? Это BLOB? БФАЙЛ? КЛОБ?

APC 21.05.2019 11:40

Я понял от этого вопроса, что H" file-read() возвращает блоб. Пожалуйста, уточните свой вопрос, если это не так.

APC 21.05.2019 13:40
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
296
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме