【问题标题】:Parse/shred XML into relational tables using PL/SQL使用 PL/SQL 将 XML 解析/分解为关系表
【发布时间】:2013-04-22 13:53:33
【问题描述】:

我有一个 XML 存储在名为 XML_TABLE 的表中名为 xml_file 的 XMLTYPE 列中。我正在使用 Oracle 11g r2。

<ROWSET> 
 <DEPARTMENT>
  <DEPARTMENT_ID>DEP22681352268280797</DEPARTMENT_ID>
  <DEPARTMENT_NAME>myDEPARTMENT</DEPARTMENT_NAME>
  <SECTIONS_ID>6390135666643567</SECTIONS_ID>
  <SECTIONS_NAME>mySection</SECTIONS_NAME>
 </DEPARTMENT>
 <DEPARTMENT>
  <DEPARTMENT_ID>DEP255555555550797</DEPARTMENT_ID>
  <DEPARTMENT_NAME>myDEPARTMENT2</DEPARTMENT_NAME>
  <SECTIONS_ID>63901667779243567</SECTIONS_ID>
  <SECTIONS_NAME>mySection2</SECTIONS_NAME>
 </DEPARTMENT>
</ROWSET>

我想将这些值插入到两个表中,即部门和部门。我将如何在 PL/SQL 中实现这一点。 我曾尝试使用提取功能,但我只是读到它不再推荐,因此寻求帮助。此外,我不知道我将如何迭代 xml values..cursor...??

【问题讨论】:

  • Oracle 的哪个版本?
  • 您能否满意您的预期表格以及关系、PK、FK 等?

标签: sql oracle plsql xml-parsing oracle11gr2


【解决方案1】:

使用 XQuery 将 XML 文档拆分为有趣的数据块。用 XMLTable 表示这些块以获得可以在 SQL 中使用的东西。

这是针对您的案例的一个粗略的解决方案(显然它必须是粗略的,您还没有发布表结构,但我假设 SECTIONS 具有 DEPARTMENTS 的外键)。你应该阅读文档to find out more

insert all
   into departments
       values (dept_id, dept_name)
   into sections
       values (dept_id, sect_id, sect_name)
select dept.id as dept_id
      , dept_name as dept_name
      , sect.id as sect_id
      , sect.name as sect_name
from your_table
     , xmltable('/ROWSET/DEPARTMENT'  
               passing your_table.xml_col
               columns 
                  "ID"  varchar2(30) path 'DEPARTMENT_ID'
                  , "NAME"  varchar2(30) path 'DEPARTMENT_NAME'
              ) dept
     , xmltable('/ROWSET/SECTION'  
               passing your_table.xml_col
               columns 
                  "ID"  varchar2(30) path 'SECTION_ID'
                  , "NAME"  varchar2(30) path 'SECTION_NAME'
              ) sect

顺便说一句,DEPARTMENT 的重复很糟糕。 XML 很难使用,但至少它支持分层数据结构。如果您不打算使用它来避免重复,那么您不妨使用 CSV。无论如何,由于发布的 XML 不包含任何实际的重复,因此解决了它的失败留给读者作为练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 2013-06-22
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多