base64编码clob到blob

时间:2016-11-15 15:46:47

标签: oracle plsql

我需要baseb编码blob到clob。我做了一些搜索,似乎建议使用相同的功能:

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 个答案:

答案 0 :(得分:2)

Wikipedia"输出字节与输入字节的比率是4:3(33%开销)"

24573是32767的75%,这是VARCHAR2的大小限制。

如果它不起作用,并且轻微减少到24570并没有解决它,那么我怀疑是否存在一些奇怪的字符转换问题。如果您的数据库使用固定的2字节宽度字符集,我将步骤值降低到12285是安全的。

答案 1 :(得分:0)

尝试:

Sub GetTable()

    Dim currentTable As Table

    Set currentTable = Selection.Tables(1)
    'test purpose only
    Debug.Print currentTable.Rows.Count, currentTable.Columns.Count

    'and to get table indention try with this
    Debug.Print currentTable.Range.ParagraphFormat.LeftIndent

End Sub