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

在返回JSON_OBJECT_T数组的SQL查询中添加OFFSET和FETCH NEXT报错求助

解决PL/SQL中OFFSET/FETCH与JSON_ARRAYAGG冲突的ORA-00937错误

错误原因

ORA-00937错误是因为你直接在包含聚合函数JSON_ARRAYAGG的主查询中使用OFFSET和FETCH NEXT子句。JSON_ARRAYAGG属于分组聚合函数(默认将全表作为一个分组),而分页子句是针对单行数据的筛选操作,两者直接混用会破坏分组逻辑,导致报错。

解决方案

先通过子查询完成数据分页筛选,再对筛选后的结果执行JSON聚合操作,避免聚合函数与分页子句的逻辑冲突。

修改后的PL/SQL代码

DECLARE
    l_json_object JSON_OBJECT_T;
    l_json CLOB;
BEGIN
   SELECT
      JSON_OBJECT(
         KEY 'employees' VALUE 
            JSON_ARRAYAGG(
               JSON_OBJECT(KEY 'empno' VALUE id
                           ,KEY 'ename' VALUE name
                           ,KEY 'job' VALUE email_id)
               ORDER BY id
           RETURNING CLOB) 
        RETURNING CLOB)
     INTO l_json
     FROM (
         -- 先分页筛选需要的数据
         SELECT id, name, email_id
         FROM employee_tbl
         ORDER BY id DESC OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY
     );
   -- 转换CLOB为JSON_OBJECT_T
   l_json_object := JSON_OBJECT_T.PARSE(l_json);

   -- 输出验证结果
   dbms_output.put_line(l_json_object.to_clob);
END;
/

示例表结构

CREATE TABLE employee_tbl 
(
    id, 
    name, 
    email_id
) AS
  SELECT 1065, 'Abu',  'email1@example.com' FROM DUAL UNION ALL
  SELECT 1066, 'Umar', 'email2@example.com' FROM DUAL

期望输出

{
    "employees":
        [
            { "empno": 1065,"ename": "Abu", "job": "email1@example.com" },
            { "empno": 1066, "ename": "Umar", "job": "email2@example.com" }
        ]
}

内容的提问来源于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.28 19:33:40