You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Base64转Blob遇PLS-00172错误:字符串字面量过长问题

解决PL/SQL中Base64转Blob时的PLS-00172错误

错误原因

PLS-00172是因为你用VARCHAR2存储过长的Base64字符串字面量,PL/SQL中VARCHAR2的字面量最大允许长度为32767字节(如果是多字节字符集,实际能存的字符数更少),而你定义的l_resp是VARCHAR2(35000),赋值的字符串已经接近或超过限制,导致报错。另外,处理PDF这类大体积Base64数据,VARCHAR2本身就不适合,应该用CLOB存储。

修正方案

  1. 将存储Base64的变量类型从VARCHAR2改为CLOB,规避长度限制问题。
  2. 函数参数同步改为CLOB类型,适配大文本处理场景。
  3. 调整Base64分段解码的长度为4的整数倍(Base64每4个字符对应3字节原始数据,分段必须是4的倍数才能保证解码正确)。

修正后的代码

DECLARE
    l_resp   CLOB
        := 'JVBERi0xLjQKJfbk/N8KMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovVmVyc2lvbiAvMS40Ci9QYWdlcyAyIDAgUgo+PgplbmRvYmoKMyAwIG9iago8PAovTW9kRGF0ZSAo';

    FUNCTION base64decodeclobtoblob (p_clob CLOB)
        RETURN BLOB
    IS
        l_blob     BLOB;
        l_raw      RAW (32767);
        -- 选用4的整数倍作为分段长度,避免解码异常
        l_amt      NUMBER := 7680;
        l_offset   NUMBER := 1;
        l_temp     VARCHAR2 (10000 CHAR);
    BEGIN
        DBMS_LOB.createtemporary (l_blob, FALSE, DBMS_LOB.CALL);
        
        LOOP
            DBMS_LOB.read (p_clob, l_amt, l_offset, l_temp);
            l_offset := l_offset + l_amt;
            
            l_raw := UTL_ENCODE.base64_decode (UTL_RAW.cast_to_raw (l_temp));
            DBMS_LOB.append (l_blob, TO_BLOB (l_raw));
        END LOOP;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RETURN l_blob;
        WHEN OTHERS THEN
            DBMS_LOB.freetemporary(l_blob);
            RAISE;
    END;

    bl       BLOB;
BEGIN
    bl := base64decodeclobtoblob(l_resp);
    -- 可添加后续处理逻辑,例如将Blob存入数据表
    -- INSERT INTO your_table (blob_column) VALUES (bl);
END;
/

补充提示

如果实际业务中Base64字符串非常长(比如完整的PDF标签),建议直接从WebService返回结果存入CLOB变量,不要用字面量赋值,避免再次触发长度限制。

内容的提问来源于stack exchange,提问作者Adeel Aslam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:55:28