2016-11-10 57 views
1

首先,我將圖像的BLOB轉換爲CLOB,然後將該CLOB轉換回BLOB。我看不到重建的圖像。我怎麼解決這個問題?如何將CLOB轉換爲Oracle中的BLOB?

blob_to_clob功能:

CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB) RETURN CLOB AS 
    v_clob CLOB; 
    v_varchar VARCHAR2(32767); 
    v_start PLS_INTEGER := 1; 
    v_buffer PLS_INTEGER := 32767; 
BEGIN 
    DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); 
    FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in)/v_buffer) 
    LOOP 
    v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)); 
    DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar); 
    v_start := v_start + v_buffer; 
    END LOOP; 
    RETURN v_clob; 
END blob_to_clob; 

clob_to_blob功能:

CREATE OR REPLACE FUNCTION clob_to_blob2(p_clob IN CLOB) RETURN BLOB IS 
    v_blob BLOB; 
    v_offset NUMBER DEFAULT 1; 
    v_amount NUMBER DEFAULT 4096; 
    v_offsetwrite NUMBER DEFAULT 1; 
    v_amountwrite NUMBER; 
    v_buffer VARCHAR2(4096 CHAR); 
BEGIN dbms_lob.createtemporary(v_blob, TRUE); 
    Begin 
    LOOP 
     dbms_lob.READ (lob_loc => p_clob, 
     amount => v_amount, 
     offset => v_offset, 
     buffer => v_buffer); 

     v_amountwrite := utl_raw.length (r => utl_raw.cast_to_raw(c => v_buffer)); 

     dbms_lob.WRITE (lob_loc => v_blob, 
     amount => v_amountwrite, 
     offset => v_offsetwrite, 
     buffer => utl_raw.cast_to_raw(v_buffer)); 

     v_offsetwrite := v_offsetwrite + v_amountwrite; 

     v_offset := v_offset + v_amount; 
     v_amount := 4096; 
    END LOOP; 
    EXCEPTION 
    WHEN no_data_found THEN 
    NULL; 
    End; 
    RETURN v_blob; 
END clob_to_blob2; 
+2

如何將BLOB轉換爲CLOB?特別是在UTF-8的情況下,你可能會有許多無效的「字符」被刪除。正在談論[Base64](https://en.wikipedia.org/wiki/Base64)編碼? –

+1

除了可以將烤麪包片放回烤麪包機並按下「烤麪包片」之外,您無法做到這一點。您在第一次轉換時丟失了信息,您無法在第二次轉換中放回信息。 – Lunc

+0

[相關問題這裏](http://stackoverflow.com/q/42002816/521799) –

回答

2

這樣的代碼將執行最少的重新編碼:

create or replace function clob2blob(AClob CLOB) return BLOB is 
    Result BLOB; 
    o1 integer; 
    o2 integer; 
    c integer; 
    w integer; 
begin 
    o1 := 1; 
    o2 := 1; 
    c := 0; 
    w := 0; 
    DBMS_LOB.CreateTemporary(Result, true); 
    DBMS_LOB.ConvertToBlob(Result, AClob, length(AClob), o1, o2, 0, c, w); 
    return(Result); 
end clob2blob; 
/

但CLOB不能properl y包含所有沒有任何編碼的圖像數據,比如Base64