Как обрабатывать XML с помощью xmltable - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть XML, содержащий данные отношений, такие как эта

<object name="object1">
   <attribute name="attribute1"/>
   <attribute name="attribute2">
      <value>value 1</value>
      <value>value 2</value>
   </attribute>
</object>   
<object name="object2">
   <attribute name="attribute1"/>
   <attribute name="attribute2">
      <value>value 1</value>
      <value>value 2</value>
   </attribute>
</object> 

, и мне нужно сохранить их в следующей реляционной модели:

Объект таблицы

Атрибут таблицыFK для объекта

Значение таблицы FK для атрибута

Используя функцию XMLTable, я нашел следующее решение:

declare

          -- This cursor retreives a record for each object with it's attribute values and 
      -- the underlying attributes as XMLtype
      cursor c_object(p_xml xmltype) is
             select obj.*
               from xmltable('$d//object' passing p_xml as "d" 
                              columns ... object columns ...
                             ,attributes xmltype path 'attribute') as obj;

      -- This cursor retreives a record for each attribute with it's attribute values and 
      -- the underlying values as XMLtype
      cursor c_attributes(p_xml xmltype) is
             select att.*
               from xmltable('$d//object' passing p_xml as "d" 
                              columns ... attribute columns ...
                             ,values xmltype path 'value') as att;

      -- This cursor retreives a record for each attribute with it's attribute values and 
      -- the underlying values as XMLtype
      cursor c_values(p_xml xmltype) is
             select val.*
               from xmltable('$d//object' passing p_xml as "d" 
                             ,columns value varcahr2(100) path 'value') as val;                      

    begin

       -- p_xml contains the XML document

       for r_obj in c_obj(p_xml) loop
          -- insert an object record
          insert into object...

          for r_att in c_att(r_obj.attributes) loop
             -- insert into attribute
             insert into attribute ...

             for r_val in c_val(r_att.values) loop
                -- insert into values

             end loop;
          end loop;
       end loop;
    end;    

Это правильный способ сделать это?Или как бы вы это сделали?

1 Ответ

0 голосов
/ 27 января 2012

Извините, это так ужасно неполно, но я надеюсь, что это ведет в правильном направлении.

Ваше решение выполняет МНОГО анализа XML. Это может сработать, но если нужно обработать много данных, я бы подумал, что это займет некоторое время. Индексирование XML, вероятно, поможет и может сделать ваш подход приемлемым.

Лучшим решением, вероятно, было бы использование пакетов DBMS_XMLSAVE или DBMS_XMLSTORE.

...