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

Oracle 21c ATP中ORDS返回大数据时触发ORA-06502错误

Oracle 21c ATP中ORDS返回大CLOB数据触发ORA-06502错误

我在Oracle 21c ATP数据库中使用PL/SQL存储过程向ORDS处理器返回CLOB格式数据,当返回大量数据(如70行以上的采购订单表头及行项)时触发如下错误,少量数据时可正常运行:

错误信息

请求无法处理,因为评估与该资源关联的SQL语句时发生错误。请验证请求的URI和负载是否正确指定。若问题持续,请联系资源作者。SQL错误代码:6502,错误信息:ORA-06502: PL/SQL: value or conversion error ORA-06512: at line 9

PL/SQL存储过程

CREATE OR REPLACE PROCEDURE GET_PO_DETAILS(po_response OUT CLOB) AS
    l_po_header_json CLOB;
BEGIN
    -- 创建临时LOB
    DBMS_LOB.CREATETEMPORARY(po_response, TRUE);
    DBMS_LOB.CREATETEMPORARY(l_po_header_json, TRUE);

    -- 主查询:将表头和行项聚合为JSON数组
    SELECT JSON_ARRAYAGG( -- 外层JSON_ARRAYAGG返回完整CLOB
        JSON_OBJECT(
            'PO_HEADER_ID'    VALUE h.PO_HEADER_ID,
            'PO_NUMBER'       VALUE h.PO_NUMBER,
            'VENDOR_NAME'     VALUE h.VENDOR_NAME,
            'ORDER_DATE'      VALUE TO_CHAR(h.ORDER_DATE, 'YYYY-MM-DD'),
            'TOTAL_AMOUNT'    VALUE h.TOTAL_AMOUNT,
            'STATUS'          VALUE h.STATUS,
            'CREATED_BY'      VALUE h.CREATED_BY,
            'CREATED_DATE'    VALUE TO_CHAR(h.CREATED_DATE, 'YYYY-MM-DD'),
            'UPDATED_BY'      VALUE h.UPDATED_BY,
            'UPDATED_DATE'    VALUE TO_CHAR(h.UPDATED_DATE, 'YYYY-MM-DD'),
            'LINES' VALUE (
                SELECT JSON_ARRAYAGG(
                    JSON_OBJECT(
                        'PO_LINE_ID'       VALUE l.PO_LINE_ID,
                        'LINE_NUMBER'      VALUE l.LINE_NUMBER,
                        'ITEM_CODE'        VALUE l.ITEM_CODE,
                        'ITEM_DESCRIPTION' VALUE l.ITEM_DESCRIPTION,
                        'QUANTITY'         VALUE l.QUANTITY,
                        'UNIT_PRICE'       VALUE l.UNIT_PRICE,
                        'LINE_TOTAL'       VALUE l.LINE_TOTAL,
                        'CREATED_BY'       VALUE l.CREATED_BY,
                        'CREATED_DATE'     VALUE TO_CHAR(l.CREATED_DATE, 'YYYY-MM-DD'),
                        'UPDATED_BY'       VALUE l.UPDATED_BY,
                        'UPDATED_DATE'     VALUE TO_CHAR(l.UPDATED_DATE, 'YYYY-MM-DD')
                    )
                )
                FROM PO_LINES l
                WHERE l.PO_HEADER_ID = h.PO_HEADER_ID
            )
        )
    RETURNING CLOB
    )
    INTO l_po_header_json
    FROM PO_HEADER h;

    -- 赋值最终结果
    DBMS_LOB.APPEND(po_response, l_po_header_json);

EXCEPTION
    WHEN OTHERS THEN
        DBMS_LOB.CREATETEMPORARY(po_response, TRUE);
        DBMS_LOB.WRITE(po_response, LENGTH(SQLERRM) + 100, 1,
            '{"status": "ERROR", "message": "Error while fetching PO details: ' || SQLERRM || '"}'
        );
END GET_PO_DETAILS;

ORDS GET模板处理器代码

BEGIN
  ORDS.ENABLE_SCHEMA(
      p_enabled             => TRUE,
      p_schema              => 'ADMIN',
      p_url_mapping_type    => 'BASE_PATH',
      p_url_mapping_pattern => 'admin',
      p_auto_rest_auth      => FALSE);    

  ORDS.DEFINE_MODULE(
      p_module_name    => 'bl',
      p_base_path      => '/bl/',
      p_items_per_page =>  25,
      p_status         => 'PUBLISHED',
      p_comments       => NULL);      
  ORDS.DEFINE_TEMPLATE(
      p_module_name    => 'bl',
      p_pattern        => 'getData',
      p_priority       => 0,
      p_etag_type      => 'HASH',
      p_etag_query     => NULL,
      p_comments       => NULL);
  ORDS.DEFINE_HANDLER(
      p_module_name    => 'bl',
      p_pattern        => 'getData',
      p_method         => 'GET',
      p_source_type    => 'plsql/block',
      p_items_per_page =>  25,
      p_mimes_allowed  => '',
      p_comments       => NULL,
      p_source         => 
'declare
    p_po_number VARCHAR2(100) := ''PO1005'';
    -- 存储JSON内容的CLOB变量
    v_clob CLOB;
    -- 用于解析JSON的JSON对象
    l_response JSON_OBJECT_T;
begin
    GET_PO_DETAILS(po_response => v_clob);
    --l_response := JSON_OBJECT_T.parse(v_clob);
    owa_util.mime_header (''application/json'', true); 
    htp.p(v_clob);
END;'
      );

  COMMIT; 
END;

数据库表结构

-- 创建PO_HEADER表
CREATE TABLE PO_HEADER (
    PO_HEADER_ID     NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    PO_NUMBER        VARCHAR2(50) UNIQUE, 
    VENDOR_NAME      VARCHAR2(100),
    ORDER_DATE       DATE DEFAULT SYSDATE,
    TOTAL_AMOUNT     NUMBER(15,2) DEFAULT 0,
    STATUS           VARCHAR2(20) DEFAULT 'DRAFT',
    CREATED_BY       VARCHAR2(50),
    CREATED_DATE     DATE DEFAULT SYSDATE,
    UPDATED_BY       VARCHAR2(50),
    UPDATED_DATE     DATE
);

-- 创建无NOT NULL约束的PO_LINES表
CREATE TABLE PO_LINES (
    PO_LINE_ID       NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    PO_HEADER_ID     NUMBER,  -- 无外键约束
    LINE_NUMBER      NUMBER,  -- 行号
    ITEM_CODE        VARCHAR2(50),
    ITEM_DESCRIPTION VARCHAR2(200),
    QUANTITY         NUMBER(10,2) DEFAULT 1 CHECK (QUANTITY > 0),
    UNIT_PRICE       NUMBER(10,2) DEFAULT 0 CHECK (UNIT_PRICE >= 0),
    LINE_TOTAL       NUMBER(15,2) GENERATED ALWAYS AS (QUANTITY * UNIT_PRICE) VIRTUAL, 
    CREATED_BY       VARCHAR2(50),
    CREATED_DATE     DATE DEFAULT SYSDATE,
    UPDATED_BY       VARCHAR2(50),
    UPDATED_DATE     DATE
);

内容的提问来源于stack exchange,提问作者mu shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:07:11