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