从 Oracle 数据库表创建 json
Posted
技术标签:
【中文标题】从 Oracle 数据库表创建 json【英文标题】:Creating json from Oracle database table 【发布时间】:2020-08-22 20:52:21 【问题描述】:您好,我必须从 Oracle 表创建 json 文件。我有以下表格中的数据。
我想要这种格式的数据。
"add" :
[
"canonicalName" : "Apple Computers",
"synonyms" :
[
"Apple",
"Apple Inc"
]
,
"canonicalName" : "Google India",
"synonyms" :
[
"Google"
]
,
"canonicalName" : "IBM",
"synonyms" :
[
"IBM Corporation"
]
],
"delete" :
[
"canonicalName" : "IBM",
"synonyms" :
[
"IBM Corporation"
]
,
"canonicalName" : "TCS"
],
"update" :
[
"canonicalName" : "Infosys",
"synonyms" :
[
"Infosys Tech"
]
,
"canonicalName" : "Wipro Tech",
"synonyms" :
[
"Wipro Technology"
]
]
以下代码运行正常。
with
prep (operation, orgname, fragment) as (
select operation, orgname,
json_object( key 'canonicalName' value orgname,
key 'synonyms'
value nullif(json_arrayagg(synonyms order by synonyms), '[]')
FORMAT JSON ABSENT ON NULL
)
from t
group by orgname, operation
)
select json_objectagg( key operation
value json_arrayagg(fragment order by orgname)
) as json_str
from prep
group by operation;
现在我必须在此表中添加一列。
所以tablename
列包含“ORG”和“ITEM”值。所以我必须创建 2 个文件,一个是 item.json,另一个是 ORG.json,依此类推。
我需要将在 item.json 中具有 ITEM 并且在 ORG.json 中具有 ORG 的数据放入。
我需要在上面的查询中做些什么改变。
甚至 PL/SQL 也可以。您能否建议对上述查询进行更改?
如果我们可以将结果存储到某个数组中并返回调用环境也可以
【问题讨论】:
你不只是在你的选择中添加一个 WHERE 条件“WHERE TABLENAME='ITEM',或者 WHERE TABLENAME= 实际上 Ed 可以有 n 个条目,例如 ITEM、ORG、FEATURES,所以我一直在寻找完美的答案。我可以创建提供输出但可能不正确的代码。所以我正在为产品创建代码。所以尽我所能编写正确的代码。我其实是一个java开发者。 我在逻辑中添加了参数,因此它开始给出与选择查询不匹配的错误。后来它给出了一些奇怪的输出。告诉我一件事不使用光标可以完成吗? 您可能在错误的位置添加了where
子句。在我的代码中找到名为prep
的子查询(在with
子句中)。找到from
子句:from t
。紧随其后,添加where
子句:... from t WHERE tablename = :tablename ...
这里:tablename
(带有前导冒号)是一个绑定变量;你可以给它像'ITEM'
、'ORG'
等值。
"任意数量的值" ...好吧,我只是以您展示的两个为例。如果您接受我的建议来编写查询,以便从调用者提供参数,那么它将适用于您提供的任何值。
【参考方案1】:
这是一种方法。您无需提前知道TABLENAME
列中的值。相反,查询输出将在 TABLENAME
中的每个唯一值有一行,分两列显示:TABLENAME 和该 TABLENAME 的相应 JSON 字符串。
with
prep1 (tablename, operation, orgname, fragment) as (
select tablename, operation, orgname,
json_object( key 'canonicalName' value orgname,
key 'synonyms'
value nullif(json_arrayagg(synonyms order by synonyms), '[]')
FORMAT JSON ABSENT ON NULL
)
from t
group by tablename, orgname, operation
)
, prep2 (tablename, operation, org_str) as (
select tablename, operation, json_arrayagg(fragment order by orgname)
from prep1
group by tablename, operation
)
select tablename, json_objectagg(key operation value org_str) as json_str
from prep2
group by tablename
;
TABLENAME JSON_STR
--------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ITEM "add":["canonicalName":"Apple Computers","synonyms":["Apple","Apple Inc"],"canonicalName":"Google India","synonyms":["Google"],"canonicalName":"IBM","synonyms":["IBM Corporation"]],"update":["canonicalName":"Infosys","synonyms":["Infosys Tech"],"canonicalName":"Wipro Tech","synonyms":["Wipro Technology"]],"delete":["canonicalName":"IBM","synonyms":["IBM Corporation"],"canonicalName":"TCS"]
ORG "add":["canonicalName":"Apple Computers","synonyms":["Apple","Apple Inc"],"canonicalName":"Google India","synonyms":["Google"],"canonicalName":"IBM","synonyms":["IBM Corporation"]],"update":["canonicalName":"Infosys","synonyms":["Infosys Tech"],"canonicalName":"Wipro Tech","synonyms":["Wipro Technology"]],"delete":["canonicalName":"IBM","synonyms":["IBM Corporation"],"canonicalName":"TCS"]
【讨论】:
以上是关于从 Oracle 数据库表创建 json的主要内容,如果未能解决你的问题,请参考以下文章