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

Oracle ORDS PL/SQL存储过程CLOB输出超32767字符报错求助

解决ORDS调用PL/SQL存储过程返回超长CLOB的问题

问题背景

通过Python/Postman调用Oracle ORDS定义的PL/SQL存储过程获取o_json_clob值时,当该CLOB字符数≤32767可正常返回,但超过该长度时存储过程报错。但在Oracle SQL Developer中调用同一存储过程却能正常运行,需要解决超长CLOB的获取问题。

解决方案

1. 将ORDS处理程序改为返回CLOB的函数形式

ORDS对PL/SQL块的输出默认存在VARCHAR2长度限制(32767字符),改用函数返回CLOB可绕过此限制:

-- 1. 创建封装存储过程的函数
CREATE OR REPLACE FUNCTION apps.XXOM_PRJWS_GET_PRICE_CONFIG_FUNC(p_body_text CLOB) RETURN CLOB IS
    o_json_clob CLOB;
BEGIN
    apps.XXOM_PRJWS_API_PKG.get_price_config_details(i_json_clob => p_body_text, o_json_clob => o_json_clob);
    RETURN o_json_clob;
END;
/

-- 2. 重新定义ORDS处理程序
ORDS.DEFINE_HANDLER(
    p_module_name    => 'EMRPRJWSTV1.0',
    p_pattern        => 'getPriceConfigDetails',
    p_method         => 'GET',
    p_source_type    => 'plsql/function',
    p_mimes_allowed  => 'application/json',
    p_comments       => NULL,
    p_source         => 'BEGIN RETURN apps.XXOM_PRJWS_GET_PRICE_CONFIG_FUNC(:body_text); END;'
);

2. 在PL/SQL块中直接输出CLOB内容

通过htp.p直接输出CLOB,让ORDS将输出作为响应返回,无需依赖变量传递限制:

ORDS.DEFINE_HANDLER(
    p_module_name    => 'EMRPRJWSTV1.0',
    p_pattern        => 'getPriceConfigDetails',
    p_method         => 'GET',
    p_source_type    => 'plsql/block',
    p_mimes_allowed  => 'application/json',
    p_comments       => NULL,
    p_source         => '
DECLARE
    o_json_clob                CLOB;
    v_appname                  VARCHAR2(1000);
BEGIN
    apps.XXOM_PRJWS_API_PKG.get_price_config_details(i_json_clob => :body_text, o_json_clob => o_json_clob);
    htp.p(o_json_clob); -- 直接输出CLOB内容
END;'
);

3. 确保存储过程中CLOB的正确初始化

存储过程中未正确初始化CLOB可能导致超长拼接时出错,显式初始化临时LOB:

CREATE OR REPLACE PACKAGE BODY APPS.xxom_prjws_api_pkg IS
    PROCEDURE get_price_config_details(i_json_clob       CLOB,
                                      o_json_clob   OUT CLOB) IS
    BEGIN
        -- 初始化临时CLOB
        DBMS_LOB.CREATETEMPORARY(o_json_clob, TRUE);
        DBMS_LOB.OPEN(o_json_clob, DBMS_LOB.LOB_READWRITE);
        
        -- 原有拼接逻辑
        DBMS_LOB.APPEND(o_json_clob, TO_CLOB('"item_type_code":"'|| l_line_rec_tbl(j).item_type_code||'",'));
        DBMS_LOB.APPEND(o_json_clob, TO_CLOB('"line_number":"'|| l_line_rec_tbl(j).line_number||'",'));
        
        -- 关闭临时LOB
        DBMS_LOB.CLOSE(o_json_clob);
    END;
END;
/

4. 调整ORDS的最大响应长度参数

修改ORDS配置,允许更大的响应长度:

BEGIN
    ORDS.SET_PARAMETER('plsql.max_response_length', '2000000'); -- 根据业务需求设置合适值(示例为2MB)
END;
/

内容的提问来源于stack exchange,提问作者Kamlesh Dhairyavan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:55:16