从 sqlplus 输出 json。格式化它,使其出现在一行上

Posted

技术标签:

【中文标题】从 sqlplus 输出 json。格式化它,使其出现在一行上【英文标题】:Output json from sqlplus. Format it so that it appears on one line 【发布时间】:2020-10-20 01:35:33 【问题描述】:

我们正在使用以下代码:

SELECT json_object('time' VALUE localtimestamp,'db_schema' VALUE 'USER1', status VALUE COUNT(1) FORMAT JSON) FROM <TABLE> GROUP BY status;

但是我们得到如下两行的输出:

JSON_OBJECT('TIME'VALUELOCALTIMESTAMP,'DB_SCHEMA'VALUE'USER1',STATUSVALUECOU
--------------------------------------------------------------------------------
"time":"2019-10-16T12:14:40.540181","db_schema":"USER1","SUBMITTED":123
"time":"2019-10-16T12:14:40.540181","db_chema":"USER1","RUNNING":456

实际上,我们希望输出格式如下:

"time":"2019-10-16T11:41:38.393816","db_schema":"USER1", ["submitted":123, "running":456]

所以,如您所见,我们希望将提交的值和运行的值放在一行中^^

我尝试过使用 sqlplus concat 功能 '||'但它似乎不适用于 json 输出。

在我继续努力的同时,有没有人可以举例说明类似的功能是如何工作的,或者可以通过任何其他方式来实现这一目标?

谢谢。

【问题讨论】:

【参考方案1】:

如果您希望它在一行中,也许您的意图是让结果成为单个 JSON 文档,在这种情况下,您应该研究 JSON_ARRAYAGG 之类的内容。

【讨论】:

【参考方案2】:

这是我所知道的……

SELECT json_object('time' VALUE localtimestamp,'db_schema' VALUE 'USER1'),
json_objectagg(STATUS value count(JOB_ID) returning varchar2(32000))
FROM <TABLE> GROUP BY status;

^这很有效,就在单行上显示输出而言,但它并不像预期的那样全部在一个对象中。您需要 'returning varchar2(32000)' 来避免 18c 以下版本中的字符最大错误。

【讨论】:

以上是关于从 sqlplus 输出 json。格式化它,使其出现在一行上的主要内容,如果未能解决你的问题,请参考以下文章

如何从codeigniter中的模型生成json格式

如何从sqlplus到bash脚本获取SQL查询输出

oracle sqlplus 格式化输出

sqlplus中设定行大小页大小字符列格式数字列格式清屏

如何使用 SQLPLUS 假脱机到 CSV 格式的文件?

[oracle]sqlplus 输出格式化print_table学习