1

请参阅本文末尾的 pl/sql 代码块

我正在编写一些 pl/sql 代码来从 zip 中提取某些文件。我正在使用http://technology.amis.nl/wp-content/uploads/2010/06/as_zip7.txt中的“as_zip”包来获取 zip ( ) 中的文件名AS_ZIP.GET_FILE_LIST并提取某些文件名放入BLOB( AS_ZIP.GET_FILE) 中,然后使用 . 将其写入文件UTL_FILE

第一个问题
据我在监控中看到的,UNDO TABLESPACE在此过程中似乎没有被写入,但我想与其他人确认这是真的……如果我只是将特定文件的内容提取到然后将BLOB其写入文件,会UNDO TABLESPACE受到影响吗?企业在他们收费的数据库上使用的每一兆字节,所以我们需要尽可能地寻找减少表空间的方法......

第二个问题
就将 blob 写入文件而言,是否有比我如何完成它更有效的方法?第一个文件(碰巧是最大的 3.03GB)写入文件系统的速度很快,但随后每个文件的写入速度似乎越来越慢。我是否需要释放资源或以不同方式分配它们或......

SET SERVEROUTPUT ON
declare
  zip_files as_zip.file_list;
  l_file UTL_FILE.FILE_TYPE;
  L_BUFFER RAW (32767);
  L_AMOUNT BINARY_INTEGER := 32767;
  l_pos INTEGER;
  L_BLOB BLOB;
  l_blob_len INTEGER;
BEGIN

  DBMS_OUTPUT.ENABLE(1000000);

  ZIP_FILES  := AS_ZIP.GET_FILE_LIST( 'MY_DIR', 'MY_FILE.zip' );

  for i in zip_files.first() .. zip_files.last
  LOOP
    FOR EXT_TABLE_REC IN (SELECT LOCATION FROM USER_EXTERNAL_LOCATIONS) LOOP

      -- Check if there's a match between what's in the zip file and what the external table name is
      IF (INSTR(TRIM(LOWER(ZIP_FILES(I))),TRIM(LOWER(EXT_TABLE_REC.LOCATION || '__'))) > 0) THEN

        DBMS_OUTPUT.PUT_LINE('Match found on ' || ZIP_FILES(I) || ', ' || EXT_TABLE_REC.LOCATION || ' - processing...');  

        L_BLOB := AS_ZIP.GET_FILE('MY_DIR', 'MY_FILE.zip', zip_files(i));

        -- Open the destination file. Note the third parameter "wb"
        l_file := UTL_FILE.FOPEN ('MY_DIR', EXT_TABLE_REC.LOCATION, 'wb');

        l_blob_len := DBMS_LOB.getlength (l_blob);

        -- Read chunks of the BLOB and write them to the file until complete.
        l_pos := 1;

        WHILE l_pos < l_blob_len
        LOOP
          DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
          UTL_FILE.put_raw(l_file, l_buffer, FALSE);
          l_pos := l_pos + l_amount;
        END LOOP;

        -- Close the file.
        UTL_FILE.FCLOSE (L_FILE);

      end if;

    end loop;

  end loop;

END;
/

如果有人想知道,这是我登录时返回的数据库信息:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, Oracle Label Security,
OLAP, Data Mining, Oracle Database Vault and Real Application Testing options

编辑 1
我已经EXCEPTION WHEN OTHERS根据我在 Oracle 网站上找到的信息删除了该块。现在,这个过程似乎只是挂起,所以不确定问题现在发生在哪里......

4

2 回答 2

0

LOB 段的撤消的管理方式与哈希表的正常撤消不同。撤消是作为 lob 列本身的一部分进行管理和存储的。使用 pctversion 参数,您可以指定为撤消留出多少空间。该值指定为百分比值。

于 2012-06-05T08:35:20.193 回答
0

在 DBMS_LOB.READ 调用中,l_amount 是一个 IN OUT 参数,并且每次通过您的外部循环都会变得越来越小。它可以小到 1,在这种情况下,您一次处理 1 个字节。在你设置 l_pos := 1; 之后 还设置 l_amount=32767;

于 2015-01-20T20:06:25.413 回答