我试图在应用程序启动时将数据加载到db中。
在H2中,我使用以下查询,它运行良好。使用Oracle时,它不起作用。有人可以指出正确的方向吗?我浏览了oracle文档,但没有找到等效的文件。
INSERT INTO TEMPLATES(ID,NAME,BODY) VALUES('2b04469f31c445ca82c354322845b52b', 'Records', FILE_READ('/opt/bin/Records.txt'));
答案 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