2016-12-30 19 views
1

我有一個xlsx文件sample.xlsx存儲在一個大小約爲1,699 KB的遠程目錄中。 我已經嘗試了兩種流行的PL/SQL包(UTL_COMPRESSAS_ZIP),分別將它們壓縮到gzipzip使用PL/SQL更好的文件壓縮包?

隨着下面使用AS_ZIP的代碼,我已經將文件壓縮到1619 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; 

隨着使用UTL_COMPRESS下面的代碼(從原始post截取),我的文件壓縮到1618 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; 

雖然很小,但看起來UTL_COMPRESS在文件大小上有更好的壓縮。 我想知道在Oracle提供的UTL_COMPRESS上使用自定義AS_ZIP是否有一些看不見的優勢?

謝謝。

+0

簡單謝謝@APC!我會接受它作爲答案。你會推薦哪兩個? –

+1

請注意'xslx'已經是壓縮格式。 – Vadzim

回答

5

Anton Scheffer解釋了爲什麼他編寫了AS_ZIP包in this blog post。它應該回答你的問題。基本上它支持更多的zip格式。

此外,它有一個鏈接到包的更新版本比鏈接在您的文章中。

至於要使用哪一個,我的標準命令行總是使用Oracle內置功能,除非我們確實需要第三方產品的額外功能。

使用Oracle的標準功能是指:

  • Oracle支持服務涵蓋美國
  • 我們沒有維護代碼
  • 我們的代碼庫,許多新的加入者
相關問題