从 oracle 过程返回 Json 字符串
Posted
技术标签:
【中文标题】从 oracle 过程返回 Json 字符串【英文标题】:Returning Json string from oracle procedure 【发布时间】: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,因为数组结尾有逗号。 【参考方案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;
【讨论】:
以上是关于从 oracle 过程返回 Json 字符串的主要内容,如果未能解决你的问题,请参考以下文章
Oracle存储过程OUT CLOB返回错误字符串缓冲区太小
MySQL怎么写存储过程查询某个表的某一条记录,并把这条记录的所有列名对应的值以json格式返回呢?