2013-04-21 2 views
0

У меня есть XML, хранящийся в столбце XMLTYPE, названный как xml_file в таблице с именем XML_TABLE. Я использую Oracle 11g r2.Анализ/разбиение XML в реляционные таблицы с использованием PL/SQL

<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> 

Я хочу, чтобы вставить эти значения в двух таблиц, отделы и и sections.How я собираюсь реализовать это в PL/SQL. Я пробовал использовать функцию извлечения, но я просто прочитал ее, чтобы ее больше не рекомендовали, поэтому обращались за помощью. Более того, я не знаю, как я буду перебирать значения xml ... курсор ... ??

+0

Какая версия Oracle? – APC

+0

@APC Oracle 11G r2 –

+0

Можете ли вы представить, как выглядят ваши ожидаемые таблицы и отношения, PK, FK и т. Д.? – OldProgrammer

ответ

1

Используйте XQuery, чтобы разделить XML-документ на куски интересных данных. Представьте эти куски с XMLTable, чтобы получить что-то, с чем вы можете работать в SQL.

Вот грубый удар по решению для вашего дела (очевидно, он должен быть грубым, вы не разместили структуры таблиц, но я предполагаю, что SECTIONS имеет внешний ключ для ОТДЕЛОВ). Вы должны прочитать документы 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 

Между прочим, повторение ОТДЕЛ отстой. XML - это боль в шее для работы, но, по крайней мере, он поддерживает иерархические структуры данных. Если вы не собираетесь использовать это, чтобы избежать дублирования, вы также можете использовать CSV. Во всяком случае, поскольку размещенный XML не содержит никакого фактического дублирования, его недостатки остаются в качестве упражнения для читателя.