从 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的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle PL/SQL 中的表生成 json 文件

需要从 oracle 表数据创建 Totals 报告

Oracle tablespace 表空间创建和管理

从 JSON 数据创建联系人表

如何彻底删除oracle创建的用户和表空间

Oracle 10g中如何创建表