2014-11-06 14 views
5

Aşağıdaki gereksinimim var: Aslında txt dosyasına sahibim Bu dosyayı sıkıştırmam ve Oracle UTL_COMPRESS paketini kullanarak gz dosyası oluşturmam gerekiyor. Bu işlevi, Oracle 11g ile Unix kutusunda uygulamanız gerekiyor. Aşağıdaki kodla denedim ve bir ölçüde çalışıyor. Yani küçük boyutlu dosyayı sıkıştırmak için çalışıyor.UTL_COMPRESS paketi txt dosyasını sıkıştırmak ve oracle 11 g ile unix'te gz dosyası oluşturmak için nasıl kullanılır?

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; 

Ancak bu kod büyük dosyayı sıkıştırmak için çalışmıyor. Bu işlevin bazılarının Oracle 11g'de uygulanması durumunda lütfen yardım edin. Çok minnettar olurdum. Hata Mesajları:

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

Gördüğünüz sonuç nedir? Hata mesajı? – mmmmmpie

+0

Cevabınız için teşekkürler. Aşağıdaki hata mesajı geliyor. Hata raporu: ORA-06502: PL/SQL: sayısal ya da değer hatası ORA-06512: hattında 11 06502. 00000 - "PL/SQL: sayısal ya da değer hatası% s" * Neden: * Eylem : – Rohit

+0

İlginçtir ki kodunuzu kopyaladım ve gayet iyi çalışıyor. DIR_UTL_COM_TEST dizinini oluşturdum, bazı test verileriyle 'pk_intibuy_pkb.txt' dosyasını oluşturdum ve çalıştırdım. Şemanınızın dizinde görünebilir olduğunu, UTL_FILE yordamında yürütebildiğini ve bu txt dosyasının var olduğunu doğrulayabilir misiniz? – mmmmmpie

cevap

1

Ben sorunu çözmek mümkün. Kodu değiştirdim ve aşağıdaki kod büyük boyutlu dosyayı sıkıştırmak için iyi çalışıyor.

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; 
İlgili konular