使用PL / SQL将XML解析/分解为关系表

时间:2013-04-21 21:10:13

标签: sql oracle plsql xml-parsing oracle11gr2

我在XMLTYPE列中存储了一个XML,名为xml_file,名为XML_TABLE。我正在使用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 ... ??

1 个答案:

答案 0 :(得分: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不包含任何实际的重复解决方案,因此将其失败留作读者的练习。