oracle 中是不是有 FILE_READ 等价物?
Posted
技术标签:
【中文标题】oracle 中是不是有 FILE_READ 等价物?【英文标题】:Is there a FILE_READ equivalent in oracle?oracle 中是否有 FILE_READ 等价物? 【发布时间】:2019-05-21 09:18:39 【问题描述】:我试图在应用程序启动时将数据加载到数据库中。
对于 H2,我使用了以下查询,它运行良好。对于 Oracle,它不起作用。有人能指出我正确的方向吗?我浏览了 oracle 文档,但没有找到等效的文档。
INSERT INTO TEMPLATES(ID,NAME,BODY) VALUES('2b04469f31c445ca82c354322845b52b', 'Records', FILE_READ('/opt/bin/Records.txt'));
【问题讨论】:
templates.body
的数据类型是什么?是 BLOB 吗?文件? CLOB?
我认为 from this question 认为 H" file-read()
返回一个 blob。如果不是这种情况,请澄清您的问题。
【参考方案1】:
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'));
【讨论】:
以上是关于oracle 中是不是有 FILE_READ 等价物?的主要内容,如果未能解决你的问题,请参考以下文章