0

我使用以下代码将多个文件写入一个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 字段中的一个文件何时结束而另一个文件何时开始?

一点帮助?

4

1 回答 1

0

抛开显而易见的建议,将每个文件存储为单独的 BLOB ...

在我看来,你有两个选择。将每个文件的长度存储在某处,并使用它来控制从 BLOB 读取的数据量;或将一些分隔符值放入文件之间的 BLOB 中。分隔符对我来说似乎是更糟糕的选择 - 您必须选择一个保证不会出现在文件数据中的值,并且您必须读取单个字节才能找到分隔符。

所以存储长度。可能还有文件名。这意味着每个文件有一个子表。这让我们回到了这个问题——为什么不在每一行中存储一个 BLOB,每个文件一个呢?

于 2013-07-02T14:16:37.060 回答