我使用以下代码将几个文件写入一个 BLOB字段:
create or replace procedure blob_loader as
dir varchar2(50) := 'FILES_TO_LOAD';
lblob BLOB;
lfile BFILE;
f UTL_FILE.FILE_TYPE := UTL_FILE.FOPEN(dir, 'index.txt', 'R');
buffer VARCHAR2(30000);
begin
insert into blob_table
(blob_file)
values
(empty_blob())
returning blob_file into lblob;
dbms_lob.open(lblob, dbms_lob.lob_readwrite);
LOOP
BEGIN
utl_file.get_line(f, buffer);
lfile := BFILENAME(dir, buffer);
dbms_lob.open(lfile, dbms_lob.lob_readonly);
dbms_lob.loadfromfile(lblob, lfile, dbms_lob.getlength(lfile));
dbms_lob.close(lfile);
EXCEPTION
WHEN no_data_found THEN
EXIT;
END;
END LOOP;
dbms_lob.close(lblob);
commit;
end blob_loader;
现在我想将该字段中的文件读回磁盘,以便它们再次成为单独的文件。
有没有人知道如何定义blob字段中的一个文件何时结束而另一个文件何时开始?
很少帮忙?
答案 0 :(得分:0)
暂且不谈明确将每个文件存储为单独的BLOB ...
在我看来,你有两个选择。将文件的长度存储在某处,并使用它来控制从BLOB读取的数据量;或者将一些分隔符值放入文件之间的BLOB中。分隔符对我来说似乎是更糟糕的选择 - 您必须选择一个保证不存在于文件数据中的值,并且您必须读取单个字节才能找到分隔符。
所以存储长度。可能是文件名。这意味着每个文件有一行的子表。这让我们回到了这个问题 - 为什么不在每个行中存储一个BLOB,每个文件一个?