2014-11-06 56 views
5

我有以下要求: 其實我有txt文件我需要壓縮此文件並使用oracle UTL_COMPRESS包創建gz文件。 我需要在Oracle 11g的Unix機器上實現這個功能。 我已經嘗試了下面的代碼,它在某種程度上工作。我的意思是它正在壓縮小尺寸文件。如何使用UTL_COMPRESS包壓縮txt文件並在oracle 11g中使用unix創建gz文件?

DECLARE 
    f utl_file.file_type; 
    compressed  BLOB; 
    data_b BFILE; 
BEGIN 
    f := UTL_FILE.fopen ('DIR_UTL_COM_TEST', 'Test1.gz', 'wb'); 
    data_b := BFILENAME ('DIR_UTL_COM_TEST','pk_intibuy_pkb.txt'); 
    DBMS_LOB.FILEOPEN (data_b, DBMS_LOB.LOB_READONLY); 
    DBMS_LOB.createtemporary (compressed, false); 
    compressed := UTL_COMPRESS.lz_compress (data_b,6); 
    UTL_FILE.put_raw(f, compressed, true); 
    UTL_FILE.fclose (f); 
    DBMS_LOB.FILECLOSE (data_b); 
    DBMS_LOB.freetemporary (compressed); 
END; 

但是,這段代碼不能壓縮大文件。 如果有人在oracle 11g中實現了這個功能,請幫忙。 會很感激。 錯誤消息:

Error report: 
ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at line 11 06502. 00000 - "PL/SQL: numeric or value error%s" 
+0

你看到的具體結果是什麼?錯誤信息? – mmmmmpie 2014-11-06 16:40:39

+0

感謝您的回覆。 即將發生以下錯誤消息。 錯誤報告: ORA-06502:PL/SQL:數字或值錯誤 ORA-06512:在line 11 06502. 00000 - 「PL/SQL:數字或值錯誤%的」 *原因: *行動: – Rohit 2014-11-06 16:58:15

+0

有趣的是,我複製了你的代碼,它運行得很好。我創建了目錄'DIR_UTL_COM_TEST',用一些測試數據創建了'pk_intibuy_pkb.txt'文件,並運行它。你能否確認你的模式對目錄有可見性,在UTL_FILE過程中執行,並且該txt文件存在? – mmmmmpie 2014-11-06 17:37:48

回答

1

我能夠解決問題。我修改了代碼,下面的代碼也適用於壓縮大尺寸文件。

DECLARE 
    in_filename VARCHAR2(100); 
    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 
    in_filename := 'Test.txt'; 
    src_file := bfilename('DIR_UTL_COM_TEST', 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('DIR_UTL_COM_TEST', 
           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; 
相關問題