2016-11-15 146 views
0

我需要將base64編碼爲clob。我做了一些搜索和相同的功能似乎被建議:base64將clob編碼爲blob

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; 
/

我的問題是,什麼決定的l_step的最大尺寸是多少?我嘗試將其設置爲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