oracle base64编码clob到blob

qc6wkl3g  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(214)

我需要blob到clob的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;
/

我的问题是,什么决定了l_step的最大大小?我尝试将其设置为24573,收到以下错误:

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

我试着将它设置为23808,这似乎起作用了。

rvpgvaaj

rvpgvaaj1#

来自Wikipedia“输出字节与输入字节的比例为4:3(33%的开销)”
24573是32767的75%,这是VARCHAR 2的大小限制。
文档中没有提到,但观察Oracle 19 c的行为,UTL_ENCODE包似乎将Base64字符串行 Package 为最大64个字符的行长度(大概是为了编码的字符串可以直接与MIME一起使用)。
在Windows平台上,这意味着标准Base64的每64个字符插入2个字符(CRLF)。
将32767四舍五入为4的倍数,我们以32764作为最大输出大小。除以66告诉我们,我们有497行文本,其中最后一行没有添加CRLF-即。我们需要允许插入992个额外的字符。现在我们的可用长度下降到31772,其中的75%给了我们23829的实际输入限制,在Oracle 19 c上确认为产生长度为32764的Base64输出字符串。

xdyibdwo

xdyibdwo2#

试试看:

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;

相关问题