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

Oracle中使用json_arrayagg(json_object(*))序列化大查询报ORA-40478如何解决

问题描述

使用如下SQL可实现查询结果的JSON序列化:

WITH
    bigquery
    AS
        (SELECT level from dual connect by level<1000)
SELECT json_arrayagg(json_object(*))
  FROM bigquery

当查询数据量较大时,上述SQL执行失败,抛出错误:

ORA-40478: 输出值过大(上限:4000)

根因排查

经对比验证,直接查询大结果集的SQL可正常运行,代码如下:

WITH
    bigquery
    AS
        (SELECT level from dual connect by level<1000)
SELECT *
  FROM bigquery

确认报错由json_arrayagg(json_object(*))触发:该函数默认返回VARCHAR2类型结果,受SQL层面VARCHAR2最大4000字节的长度限制,大结果集生成的JSON串长度超出阈值就会触发报错。
该问题可在Oracle 18c环境下稳定复现。

修复方案

在JSON聚合函数中显式指定返回大字段类型即可突破长度限制,修正后代码如下:

WITH
    bigquery
    AS
        (SELECT level from dual connect by level<1000)
SELECT json_arrayagg(json_object(*) RETURNING CLOB)
  FROM bigquery

方案说明:

  • 增加RETURNING CLOB声明后,聚合生成的JSON结果将以CLOB类型返回,支持最大4GB的文本长度,可满足绝大多数大结果集的序列化导出需求。
  • 若使用Oracle 21c及以上版本,可替换为RETURNING JSON声明,使用原生JSON类型存储返回结果,长度上限更高,JSON解析与查询性能也更优。

内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:18:15