重复 JSON 具有行限制的聚合数组

Repeating JSON Aggregated Array with Row Limits

我有一个带有 JSON 聚合数组的 Oracle 19 数据库,我需要将其切断并在设定的行数后重复,例如:

[{"personId": "13274614","surname": "SMITH"},{"personId": "13275037","surname": "JONES"}]
[{"personId": "13275038","surname": "THOMAS"},{"personId": "13275039","surname": "BAKER"}]

...等这里有一些基本的 SQL 来说明我当前的数据集是如何组合在一起的:

    SELECT
    json_arrayagg(json_object('personId' VALUE person.id,
                              'surname'  VALUE person.surname
                              )
    RETURNING CLOB) as customer_json
    FROM
    person

我需要将客户数据推送到 API 端点。一次推送 1 条客户记录的性能不佳,但整个数据集数以百万计,因此无法放入单个数组中,因此,如果可能的话,我需要实现两全其美——一个数组中有 200 条客户记录,这然后结束,下一行开始包含接下来的 200 个客户的新数组。

我搜索并发现了一些关于 LIMIT 函数的提及,但未能成功应用它。

有人知道我该如何实现吗?

从 Oracle 12 开始,您可以使用 ORDER BY ... OFFSET ... FETCH NEXT ... 来限制 sub-query:

中的行数
SELECT json_arrayagg(
         json_object(
           'personId' VALUE id,
           'surname'  VALUE surname
         )
         RETURNING CLOB
       ) as customer_json
FROM   (
  SELECT id, surname
  FROM   person
  ORDER BY id
  OFFSET 0 ROWS
  FETCH NEXT 200 ROWS ONLY
)

Oracle 12之前,可以使用ROW_NUMBER解析函数:

SELECT json_arrayagg(
         json_object(
           'personId' VALUE id,
           'surname'  VALUE surname
         )
         RETURNING CLOB
       ) as customer_json
FROM   (
  SELECT id,
         surname,
         ROW_NUMBER() OVER (ORDER BY id) AS rn
  FROM   person
)
WHERE  rn BETWEEN 1 AND 200;

如果您想要 200 个行组中的所有行,则:

SELECT json_arrayagg(
         json_object(
           'personId' VALUE id,
           'surname'  VALUE surname
         )
         RETURNING CLOB
       ) as customer_json
FROM   (
  SELECT id,
         surname,
         CEIL(ROW_NUMBER() OVER (ORDER BY id)/200) AS grp
  FROM   person
)
GROUP BY grp;