使用参数化存储过程插入超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
相关产品推荐
相关产品推荐

