我需要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,这似乎有效。
答案 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