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

如何用Oracle 19c生成规范JSON文件?结合MS Report Builder场景

Oracle 19c生成JSON数组/逗号分隔JSON序列的解决方案

你在MS Report Builder中基于Oracle 19c环境,当前SQL通过json_object生成单条JSON对象但输出为每行一个对象的表格格式,需要转换为逗号分隔的JSON对象序列或标准JSON数组格式,以下是具体实现方法:

现有SQL代码

SELECT json_object(
'id'        VALUE   REFVAL,
'recdate'   VALUE   DATEAPRECV,
'apptype'   VALUE   APPTYP,
'status'    VALUE   STAT,
'person'    VALUE   NAME
)
FROM APPLICATIONS
WHERE APPTYP = 'S10'

当前输出(表格形式)

每行一个独立JSON对象:

{"id" : "1", "recdate" : "01-01-01", "apptype" : "S10", "status" : "COMP", "person" : "John"}
{"id" : "2", "recdate" : "02-02-02", "apptype" : "S10", "status" : "REG", "person" : "Mary"}

期望输出格式

格式1:逗号分隔的JSON对象序列

{"id" : "1", "recdate" : "01-01-01", "apptype" : "S10", "status" : "COMP", "person" : "John"},{"id" : "2", "recdate" : "02-02-02", "apptype" : "S10", "status" : "REG", "person" : "Mary"}

格式2:标准JSON数组

[
   {
    "id" : "1",
    "recdate" : "01-01-01",
    "apptype" : "S10",
    "status" : "COMP",
    "person" : "John"
   },
   {
    "id" : "2",
    "recdate" : "02-02-02",
    "apptype" : "S10",
    "status" : "REG",
    "person" : "Mary"
   }
]

解决方案

1. 生成标准JSON数组(推荐)

使用Oracle 12cR2及以上版本支持的JSON_ARRAYAGG函数,将所有json_object生成的对象聚合为一个JSON数组:

SELECT json_arrayagg(
    json_object(
        'id'        VALUE   REFVAL,
        'recdate'   VALUE   DATEAPRECV,
        'apptype'   VALUE   APPTYP,
        'status'    VALUE   STAT,
        'person'    VALUE   NAME
    )
    ORDER BY REFVAL -- 可选:按指定字段排序数组内元素
    RETURNING CLOB -- 可选:返回CLOB类型避免长度限制
) AS json_result
FROM APPLICATIONS
WHERE APPTYP = 'S10';
  • ORDER BY子句:可指定数组内JSON对象的排序顺序,按需添加
  • RETURNING CLOB:当结果集较大时,用CLOB类型避免VARCHAR2的长度限制

2. 生成逗号分隔的JSON对象序列

使用LISTAGG函数将单个JSON对象拼接为逗号分隔的字符串:

SELECT listagg(
    json_object(
        'id'        VALUE   REFVAL,
        'recdate'   VALUE   DATEAPRECV,
        'apptype'   VALUE   APPTYP,
        'status'    VALUE   STAT,
        'person'    VALUE   NAME
    ), ','
    WITHIN GROUP (ORDER BY REFVAL) -- 可选:排序拼接顺序
) AS json_sequence
FROM APPLICATIONS
WHERE APPTYP = 'S10';

注意:LISTAGG默认返回VARCHAR2类型,最大长度为4000字符(Oracle 12c及以上可扩展到32767),如果结果超过长度限制,可改用XMLAGG结合XMLSERIALIZE实现:

SELECT rtrim(xmlserialize(content xmlagg(xmlelement(e, json_object(
        'id'        VALUE   REFVAL,
        'recdate'   VALUE   DATEAPRECV,
        'apptype'   VALUE   APPTYP,
        'status'    VALUE   STAT,
        'person'    VALUE   NAME
    ) || ',').extract('//text()') ORDER BY REFVAL) AS CLOB), ',') AS json_sequence
FROM APPLICATIONS
WHERE APPTYP = 'S10';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:33:12