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

ORA-06550字符串字面量过长:大JSON传入存储过程报错求解

解决Oracle存储过程传入大CLOB(JSON)触发ORA-06550的问题

问题本质

报错核心并非存储过程无法处理大CLOB,而是调用参数的传递方式错误:若直接用超长字符串字面量(如execute proc_json('超长JSON'))传递,Oracle会先将其当作PL/SQL的VARCHAR2处理,而PL/SQL中VARCHAR2的最大长度为32767字节,超过该值就会触发"字符串字面量过长"错误,哪怕存储过程参数定义为CLOB也无效。

先修正测试代码的语法错误

原存储过程定义存在语法问题,多余的data会导致编译失败,正确定义如下:

create or replace procedure proc_json(json_string clob) is
begin
    dbms_output.put_line(length(json_string));
end;
/

解决方法

1. 通过CLOB变量传递参数(PL/SQL环境调用)

先将大JSON赋值给CLOB类型变量,再传入存储过程,避免直接传递超长字面量:

DECLARE
    l_json_clob CLOB;
BEGIN
    -- 若JSON内容极大,建议用DBMS_LOB分块拼接或从外部文件读取
    l_json_clob := '此处为超长JSON内容';
    -- 或用DBMS_LOB.APPEND拼接大内容
    -- DBMS_LOB.APPEND(l_json_clob, '后续JSON片段');
    
    proc_json(l_json_clob);
END;
/

2. 应用程序调用时使用绑定变量

如果是Java、Python等应用程序调用存储过程,不要将JSON直接拼入SQL语句,而是通过绑定参数的方式传递CLOB类型:

  • Java:使用CallableStatement.setClob()方法绑定CLOB参数
  • Python(cx_Oracle):通过cursor.setinputsizes指定参数为CLOB类型后传入

这种方式完全绕过字符串字面量的长度限制,是生产环境的推荐做法。

3. 超大JSON的特殊处理(超过内存承载的情况)

如果JSON大小接近CLOB的最大限制(4GB),可以用DBMS_LOB包的方法从外部文件读取内容到CLOB变量,再传入存储过程:

DECLARE
    l_json_clob CLOB;
    l_file_handle UTL_FILE.FILE_TYPE;
    l_buffer VARCHAR2(32767);
BEGIN
    DBMS_LOB.CREATETEMPORARY(l_json_clob, TRUE);
    l_file_handle := UTL_FILE.FOPEN('JSON_DIR', 'large_data.json', 'R');
    
    LOOP
        UTL_FILE.GET_LINE(l_file_handle, l_buffer);
        DBMS_LOB.WRITEAPPEND(l_json_clob, LENGTH(l_buffer), l_buffer);
    END LOOP;
    
    proc_json(l_json_clob);
    
    UTL_FILE.FCLOSE(l_file_handle);
    DBMS_LOB.FREETEMPORARY(l_json_clob);
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        UTL_FILE.FCLOSE(l_file_handle);
        DBMS_LOB.FREETEMPORARY(l_json_clob);
END;
/

注意:需要先创建JSON_DIR目录对象并授予读写权限。


内容的提问来源于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.08.10 23:50:28