【问题标题】:Parsing JSON inside of XML with Oracle SQL使用 Oracle SQL 解析 XML 中的 JSON
【发布时间】:2017-08-13 01:22:09
【问题描述】:

我有一个从 Oracle atom 提要返回的 xml,我将它临时存储在名为“ATOM”的 apex_collection 中。

XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>atomserver:newhire:feed</id>
<title type="text">New Hire</title>
<link href="https://ucf1-fap1273-hcm.oracledemos.com/hcmCoreApi/atomservlet/employee/newhire" rel="self" />
<updated>2013-12-16T18:17:56.108Z</updated>
<entry>
<link href="https://ucf1-fap1273-hcm.oracledemos.com/hcmCoreApi/atomservlet/employee/newhire/EMP300000133185858" rel="edit" />
  <id>atomservlet:newhire:EMP300000133185858</id>
  <title type="text">Ford, Laura Hired</title>
  <updated>2016-10-20T12:45:03.000Z</updated>
  <author>
     <name>BETTY.ANDERSON</name>
  </author>
  <summary type="text">Employee Period of Service Created</summary>
  <published>2016-10-20T12:45:03.000Z</published>
  <link href="https://ucf5-fap0357-hcm.oracledemos.com:443/hcmCoreApi/resources/latest/emps?q=PersonId=300000133184715&amp;effectiveDate=2015-01-01" rel="related" />
  <content type="text">{ "Context" : [ { "PrimaryPhoneNumber" : "44 1 781895862", "PersonId" : "300000133184715", "PersonName" : "Ford, Laura", "EffectiveStartDate" : "2015-01-01", "EffectiveDate" : "2015-01-01", "WorkerType" : "EMP", "PeriodType" : "E", "PersonNumber" : "3686", "WorkEmail" : "laura.ford@noreply.com" } ] }</content>
</entry>
</feed>

到目前为止,我的 SQL 查询是这样的,并且运行良好:

with t as (select clob001 from apex_collections where collection_name = 'ATOM')
SELECT title, summary, content FROM t,
   XMLTable( XMLNamespaces( 
           'http://www.w3.org/2005/Atom' AS "ns0" 

          ), 'ns0:feed/ns0:entry'            
          PASSING   XMLTYPE.createXML(t.CLOB001)
          COLUMNS title VARCHAR2(4000) path 'ns0:title' ,
                  summary VARCHAR2(240) path 'ns0:summary',
                  content VARCHAR2(4000) path 'ns0:content');

但我需要获取内容标记内的信息,该信息看起来好像是它的 JSON。我知道如何用 SQL 解析 JSON,但如果 JSON 在 XML 文档中,我不知道如何解析它。

【问题讨论】:

  • 我不明白。此时content 已作为关系数据从XML 中提取出来。那么为什么你不能用你已经拥有的方法来解析呢?当你尝试时发生了什么?
  • 内容标签的内容是JSON。因此,如果我想要 Title、Summary 和 WorkEmail,我想做这样的事情:with t as (select clob001 from apex_collections where collection_name = 'ATOM') SELECT title, summary, content.Context[0].WorkEmail FROM....等等等等,但这会抛出我 ORA-00923: FROM keyword not found where expected.

标签: sql xml oracle xmltable oracle-apex-5.1


【解决方案1】:

Oracle 的 JSON 点表示法(例如 content.Context[0].WorkEmailis pretty strict。它在这里不起作用,因为 (a) 您没有将表别名放在开头(您的 XMLTable 甚至没有表别名),但 (b) 更重要的是,您的 content 列的类型为 VARCHAR2(4000) ,而不是JSON,并且它没有IS_JSON 检查约束。我认为您甚至不能向 XMLTable 添加约束。所有这些都需要使用点符号。

根据您的评论,更简单的选择是使用 JSON 函数,例如

with t as (select clob001 from apex_collections where collection_name = 'ATOM')
SELECT title, summary, 
      json_value(content, '$.Context[0].WorkEmail') as work_email 
   FROM t,
   XMLTable( XMLNamespaces( 
           'http://www.w3.org/2005/Atom' AS "ns0" 
          ), 'ns0:feed/ns0:entry'            
          PASSING   XMLTYPE.createXML(t.CLOB001)
          COLUMNS title VARCHAR2(4000) path 'ns0:title' ,
                  summary VARCHAR2(240) path 'ns0:summary',
                  content VARCHAR2(4000) path 'ns0:content');

【讨论】:

  • 非常感谢。我将此标记为正确。我正在运行的数据库之一仍为 11.2,因此我无法访问 json_value 但我忽略了在我的帖子中提及这一点。但这是我们最终升级时的重要参考。
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 2021-12-28
  • 2015-01-23
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多