2016-11-15 14 views
0

ブロブをブロブにエンコードする必要があります。私はいくつかの検索を行ってきたと同じ機能が示唆されているように見える:l_stepの最大サイズを決定するもの、base64ブロブをブロブにエンコードする

CREATE OR REPLACE FUNCTION base64encode(p_blob IN BLOB) 
    RETURN CLOB 
-- ----------------------------------------------------------------------------------- 
-- File Name : https://oracle-base.com/dba/miscellaneous/base64encode.sql 
-- Author  : Tim Hall 
-- Description : Encodes a BLOB into a Base64 CLOB. 
-- Last Modified: 09/11/2011 
-- ----------------------------------------------------------------------------------- 
IS 
    l_clob CLOB; 
    l_step PLS_INTEGER := 12000; -- make sure you set a multiple of 3 not higher than 24573 
BEGIN 
    FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_blob) - 1)/l_step) LOOP 
    l_clob := l_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_blob, l_step, i * l_step + 1))); 
    END LOOP; 
    RETURN l_clob; 
END; 
/

私の質問はありますか?私は24573に設定する試みたと私は、次のエラーが表示されます。

ORA-06502: PL/SQL: numeric or value error: raw variable length too long, ORA-06512: at "SYS.UTL_ENCODE" 

私は23808に低く、それを設定しようと、それが動作するように見えました。

答えて

2

Wikipediaから "入力に対する出力バイトの比率がバイト4:3(33%のオーバーヘッド)"

24573サイズの上限である、32767の75%ですVARCHAR2の場合

もしうまくいかず、24570への些細な縮小で修正できない場合は、奇妙な文字変換の問題が起こっていると思われます。データベースで2バイト幅の固定文字セットが使用されている場合は、安全のためにステップ値を12285に下げます。

+0

明らかに、 'UTL_RAW.CAST_TO_VARCHAR2'関数は32767バイトで制限された' VARCHAR2'データ型を返します。 'UTL_ENCODE.base64_encode'は純粋なASCIIを返すので、制限は32767文字に等しい。マルチバイト文字変換は適用しないでください。 –

0

試行:

FUNCTION base64encode(p_blob IN BLOB) RETURN CLOB 
    IS 
     l_clob CLOB; 
     l_step PLS_INTEGER := 1998; 
    BEGIN 
     FOR i IN 0 .. TRUNC((DBMS_LOB.getlength(p_blob) - 1)/l_step) LOOP 
     l_clob := l_clob || UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(DBMS_LOB.substr(p_blob, l_step, i * l_step + 1))); 
     END LOOP; 
     RETURN l_clob; 
    END base64encode; 
+0

これはどのように私の質問に答えますか? – sb89

+0

私は経験に基づいて私のために働くものを教えています。私は最初にそれを実装したときに何年も前にやった同様の問題に遭遇し、大きなステップ値を試してみました。 – tbone