2016-11-10 31 views
1

最初に、イメージのBLOBをCLOBに変換し、そのCLOBをBLOBに戻しました。私は再変換されたイメージを見ることができません。どうすればこの問題を解決できますか?OracleでCLOBを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

トースターにトーストを戻して "untoast"を押す以上のことはできません。最初の変換では、2番目の変換で戻せない情報が失われました。 – 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のようなエンコーディングのないすべてのイメージデータを含んでいます

関連する問題