Oracle SQL 没有 file_read() 函数的等效项。但是,您可以自己编写。
但是,在我们开始之前,您需要知道 Oracle 在数据库与操作系统的互操作性方面更加锁定。许多功能默认情况下未启用,因此您可能需要友好的 DBA 的帮助才能使其正常工作。
例如,我们不能直接使用操作系统文件路径(至少在较新的版本中),所以我们需要创建一个 DIRECTORY 对象。通常,执行此操作的权限仅限于 DBA。
create directory opt_bin as '/opt/bin';
grant read on directory opt_bin to <<your_user>>;
注意/opt/bin 必须是数据库可以访问的目录。在 *nix 环境中,这意味着 oracle OS 用户在目录中至少有 read。
有了这个基础设施,我们可以创建一个函数,将 OS 文件加载到 blob 中。它使用目录和文件名来实例化 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'));