【问题标题】:Returning Json string from oracle procedure从 oracle 过程返回 Json 字符串
【发布时间】:2021-11-22 06:59:23
【问题描述】:

我需要在 PL/SQL 中有一个存储过程,它返回一个包含 json 对象的字符串。 此对象必须是表示表格行的对象列表。

例如我有桌子 MY_TABLE(ID, TB_VALUE)

输出必须是:

[
  {
    "id":"1",
    "value":"valueTest"
  },
  {
    "id":"2",
    "value":"valueTest2"
  },
  {
    "id":"3",
    "value":"valueTest3"
  }
]

我的存储过程是这样的:

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_end;
FOR output IN (SELECT * FROM MY_TABLE)
LOOP
    IF NOT l_first_rec
    THEN
        output := output || ',';
    END IF;
    output := output || JSON_OBJECT('id' VALUE ID, 'value' VALUE TB_VALUE));
END LOOP;   
output := output || (v_json_end); 
DBMS_OUTPUT.PUT_LINE(output);

END SelectProc;

END PKG_GETCOR;

实现这一目标的最佳方法是什么? 我应该使用 DBMS_OUTPUT.PUT_LINE 吗?

【问题讨论】:

  • 您的输出是无效的 JSON,因为数组结尾有逗号。

标签: sql oracle stored-procedures plsql


【解决方案1】:

从 Oracle 12 开始,您不需要过程或创建自己的 JSON 函数。

SELECT JSON_ARRAYAGG(
         JSON_OBJECT( KEY 'id' VALUE id, KEY 'value' VALUE tb_value )
         FORMAT JSON
         ORDER BY id
         RETURNING CLOB
       ) AS json
FROM   my_table;

输出:

JSON
[{"id":1,"value":"valueTest"},{"id":2,"value":"valueTest2"},{"id":3,"value":"valueTest3"}]

如果你真的想要它在一个包中,然后将它转换为一个函数并包装查询:

CREATE PACKAGE PKG_GETCOR AS
  FUNCTION SelectFunc RETURN CLOB;
END;
/

CREATE PACKAGE BODY PKG_GETCOR AS

  FUNCTION SelectFunc RETURN CLOB
  IS 
    v_json CLOB;
  BEGIN
    SELECT JSON_ARRAYAGG(
             JSON_OBJECT( KEY 'id' VALUE id, KEY 'value' VALUE tb_value )
             FORMAT JSON
             ORDER BY id
             RETURNING CLOB
           )
    INTO   v_json
    FROM   my_table;
    
    RETURN v_json;
  END SelectFunc;
END PKG_GETCOR;
/

然后:

SELECT pkg_getcor.selectfunc() FROM DUAL;

输出:

PKG_GETCOR.SELECTFUNC()
[{"id":1,"value":"valueTest"},{"id":2,"value":"valueTest2"},{"id":3,"value":"valueTest3"}]

db小提琴here

【讨论】:

  • @BarbarosÖzhan 感谢您的编辑;但是,JSON_ARRAYAGG 不会漂亮地打印输出,所以我将输出返回到实际值。
  • 完美答案,这种方式效果很好!
【解决方案2】:

DBMS_OUTPUT.PUT_LINE 用于调试,不应出现在用户的应用程序中。

如果你想显示它,你可以把那个过程变成一个函数,或者给这个过程一个 out 参数,然后读取它。

把它变成一个函数,把json放到一个clob中,返回它,然后像这样调用它:

SELECT SelectProc() FROM DUAL;

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 2014-06-15
    • 2016-05-07
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多