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

使用参数化存储过程插入超4000字符CLOB时遇字符串字面量过长错误求助

解决插入超长CLOB的“String literal too long”错误及存储过程修正

首先,你的存储过程存在逻辑问题:循环遍历JSON解析后的结果,但插入的却是整个输入CLOB p,而非解析出的y字段,先修正这个逻辑:

CREATE OR REPLACE PROCEDURE aaa(p CLOB) AS
BEGIN
  FOR all_rec IN (
                  SELECT *
                    FROM JSON_TABLE( p,
                                    '$' COLUMNS(
                                                x NUMBER PATH '$.x',
                                                y CLOB   PATH '$.y'
                                               )
                                    ) jtM
                  ) 
  LOOP
    -- 若demo1.x是序列生成的主键则保留seq_demo1.nextval,否则替换为all_rec.x
    INSERT INTO demo1(x, y) VALUES(seq_demo1.nextval, all_rec.y);
  END LOOP;
END;
/

接下来解决“String literal too long”错误:
这个错误不是存储过程本身的问题,而是调用时直接传入了超过4000字符的字符串字面量——SQL上下文里字符串字面量长度限制为4000字符,哪怕参数定义是CLOB也会触发错误。需要用以下方式调用:

方式1:在PL/SQL块中构造CLOB后传入

DECLARE
  l_clob CLOB;
BEGIN
  -- 构造超长CLOB,可通过拼接或DBMS_LOB方法生成
  l_clob := '{"x": 1, "y": "' || RPAD('a', 5000, 'a') || '"}';
  aaa(l_clob);
  COMMIT;
END;
/

方式2:使用绑定变量(应用程序调用场景)

如果是Java、Python等应用中调用,直接将CLOB类型的变量绑定到存储过程参数,避免用字符串字面量传递超长内容。

额外提示

若需要处理超过32767字符的超大CLOB(PL/SQL字符串变量的长度限制),可以用DBMS_LOB.CREATETEMPORARY创建临时CLOB,再通过DBMS_LOB.WRITEAPPEND分段写入内容后传入存储过程。

内容的提问来源于stack exchange,提问作者Monica Augustine-Plsql Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:48:23