oracle中是否有FILE_READ等效项?

时间:2019-05-21 09:18:40

标签: sql oracle file

我试图在应用程序启动时将数据加载到db中。

在H2中,我使用以下查询,它运行良好。使用Oracle时,它不起作用。有人可以指出正确的方向吗?我浏览了oracle文档,但没有找到等效的文件。

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

2 个答案:

答案 0 :(得分:1)

Oracle SQL没有等效的file_read()函数。但是,可以自己编写。

但是,在开始之前,您需要知道Oracle在与OS的数据库互操作性方面更加受束缚。默认情况下,许多功能未启用。因此,您可能需要友好的DBA的帮助才能使此功能正常工作。

例如,我们不能直接使用OS文件路径(至少在最新版本中),因此我们需要创建DIRECTORY对象。通常,执行此操作的特权仅限于DBA。

create directory opt_bin as '/opt/bin';
grant read on directory opt_bin to <<your_user>>;

请注意,/opt/bin必须是数据库可以访问的目录。在* nix环境中,这意味着oracle操作系统用户在目录上至少有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'));

答案 1 :(得分:-1)

我认为您正在寻找utl_file.fopen

但这是一个PL / SQL实用程序。你想做什么?您的文件被一次性读取吗?

更多详细信息:https://docs.oracle.com/cd/F49540_01/DOC/server.815/a68001/utl_file.htm