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 等价物?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Oracle 时间戳(6)的 postgreSql 等价物。 postreSql 是不是支持纳秒格式的时间戳?

python文件的读取

python file_read.py

Oracle 中 @@Error 的等价物是啥

Oracle 正则表达式中的 ?= 等价于啥

oracle为啥区分大小写?