使用PL/SQL更好的文件压缩包?

Mig*_*sip 1 oracle zip gzip plsql

我有一个xlsx文件sample.xlsx存储在一个远程目录中,大小约为1,699 KB.我已经尝试了两个流行的PL/SQL包(UTL_COMPRESSAS_ZIP),它们将它们压缩成gzipzip.

使用下面的代码AS_ZIP,我已将文件压缩为1,619 KB:

declare
  g_zipped_blob blob;
  l_file_name   varchar2(100) := 'sample.xlsx';
  l_directory   varchar2(100) := 'EXT_TAB_DATA';
begin
  as_zip.add1file( g_zipped_blob, l_file_name, as_zip.file2blob(l_directory, l_file_name));
  as_zip.finish_zip( g_zipped_blob );
  as_zip.save_zip( g_zipped_blob, l_directory, 'my2.zip' );
  dbms_lob.freetemporary( g_zipped_blob );
end;
Run Code Online (Sandbox Code Playgroud)

使用下面的代码(取自原始帖子)UTL_COMPRESS,我将文件压缩为1,618 KB:

DECLARE
   in_filename VARCHAR2(100) := 'sample.xlsx';
   l_directory   varchar2(100) := 'EXT_TAB_DATA';
   src_file   BFILE;
   v_content  BLOB;
   v_blob_len INTEGER;
   v_file     utl_file.file_type;
   v_buffer   RAW(32767);
   v_amount   BINARY_INTEGER := 32767;
   v_pos      INTEGER := 1;
BEGIN
   src_file := bfilename(l_directory, in_filename);
   dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
   v_content  := utl_compress.lz_compress(src_file, 9);
   v_blob_len := dbms_lob.getlength(v_content);
   v_file     := utl_file.fopen(l_directory,
                                in_filename || '.gz',
                                'wb');
   WHILE v_pos < v_blob_len LOOP
      dbms_lob.READ(v_content, v_amount, v_pos, v_buffer);
      utl_file.put_raw(v_file, v_buffer, TRUE);
      v_pos := v_pos + v_amount;
   END LOOP;
   utl_file.fclose(v_file);

EXCEPTION
   WHEN OTHERS THEN
      IF utl_file.is_open(v_file) THEN
         utl_file.fclose(v_file);
      END IF;
      RAISE;
END;
Run Code Online (Sandbox Code Playgroud)

虽然很小,但似乎UTL_COMPRESS在文件大小方面具有更好的压缩.我想知道使用AS_ZIPOracle提供的自定义是否有一些看不见的优势UTL_COMPRESS

谢谢.

APC*_*APC 5

Anton Scheffer解释了为什么他在这篇博文中写了AS_ZIP包.它应该回答你的问题.基本上它是支持其他zip格式.

它还有一个链接到更新版本的包而不是帖子中的链接.

至于使用哪一个,我的标准行总是使用Oracle内置功能,除非我们确实需要第三方产品中的额外功能.

使用Oracle的标准功能意味着:

  • Oracle Support涵盖了我们
  • 我们不必维护代码
  • 对于新的连接器,我们的代码库更加简单