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

Oracle PL/SQL存储过程返回表行JSON数组的最优实现方法咨询

问题解答

原代码存在的问题

  • 变量命名冲突:FOR循环的游标变量和OUT输出参数都叫output,会导致参数赋值逻辑完全错误
  • 初始值错误:开头将output赋值为右方括号],最终生成的JSON结构会完全不符合要求
  • 缺少首行标记更新:l_first_rec变量永远为TRUE,导致多个JSON对象之间不会添加逗号分隔符
  • 语法错误:JSON_OBJECT行末尾多了多余的右括号
  • 重复拼接右括号:循环结束后重复拼接右括号,最终会多出来一个无效的]

最优实现方案

Oracle 12c R2及以上版本支持原生JSON聚合函数JSON_ARRAYAGG,不需要手动循环拼接,性能更高、不会出现格式错误,是最优实现:

CREATE OR REPLACE PACKAGE BODY "PKG_GETCOR" AS

PROCEDURE SelectProc(output OUT VARCHAR2) IS 
BEGIN
  SELECT JSON_ARRAYAGG(
    JSON_OBJECT(
      'id' VALUE TO_CHAR(ID),
      'value' VALUE TB_VALUE
    )
    ORDER BY ID
    RETURNING VARCHAR2
  ) INTO output
  FROM MY_TABLE;
END SelectProc;

END PKG_GETCOR;
/

如果是更低版本Oracle不支持JSON_ARRAYAGG,可以使用修正后的循环版本:

CREATE OR REPLACE PACKAGE BODY "PKG_GETCOR" AS

PROCEDURE SelectProc(output OUT VARCHAR2) IS 
v_json_start CHAR(1) := '[';
v_json_end CHAR(1) := ']';
l_first_rec BOOLEAN := TRUE;

BEGIN
  output := v_json_start;
  FOR rec IN (SELECT ID, TB_VALUE FROM MY_TABLE ORDER BY ID)
  LOOP
    IF NOT l_first_rec THEN
        output := output || ',';
    END IF;
    output := output || JSON_OBJECT('id' VALUE TO_CHAR(rec.ID), 'value' VALUE rec.TB_VALUE);
    l_first_rec := FALSE;
  END LOOP;   
  output := output || v_json_end;
END SelectProc;

END PKG_GETCOR;
/

关于DBMS_OUTPUT.PUT_LINE的说明

  • 仅适合开发调试阶段临时查看输出内容,绝对不适合生产环境使用
  • 存在缓冲区上限,当生成的JSON字符串较长时会直接抛出缓冲区溢出错误
  • 依赖客户端开启DBMS_OUTPUT输出开关,默认很多客户端/调用链路不会开启该配置,无法拿到输出内容
  • 你已经声明了output作为OUT输出参数,直接通过参数返回结果是标准用法,不需要额外用DBMS_OUTPUT输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:18:05