【问题标题】: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。如果不是这种情况,请澄清您的问题。

标签: sql oracle file


【解决方案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'));

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 2011-07-14
    • 1970-01-01
    • 2011-07-29
    • 2013-06-21
    • 2014-01-09
    • 2012-02-18
    • 2014-05-02
    相关资源
    最近更新 更多