0

我有一个 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 ...??

4

1 回答 1

1

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

这是针对您的案例的解决方案的粗略尝试(显然它必须是粗糙的,您还没有发布表结构,但我假设 SECTIONS 具有 DEPARTMENTS 的外键)。您应该阅读文档以了解更多信息

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 不包含任何实际的重复,解决了它的失败留给读者作为练习。

于 2013-04-22T05:47:54.633 回答