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存储。
修正方案
- 将存储Base64的变量类型从
VARCHAR2改为CLOB,规避长度限制问题。 - 函数参数同步改为
CLOB类型,适配大文本处理场景。 - 调整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
相关产品推荐
相关产品推荐

