2012-10-19 20 views
17

Jak załadować zagnieżdżony plik xml do tabeli bazy danych?oracle plsql: jak parsować XML i wstawić do tabeli

<?xml version="1.0" ?> 
<person> 
    <row> 
     <name>Tom</name> 
     <Address> 
      <State>California</State> 
      <City>Los angeles</City> 
     </Address> 
    </row> 
    <row> 
     <name>Jim</name> 
     <Address> 
      <State>California</State> 
      <City>Los angeles</City> 
     </Address> 
    </row> 
</person>  

W tym xml, osoba jest nazwą tabeli, nazwa jest nazwą pliku, Tom jest wartością pola. Adres jest podtablicą, a stan i miasto to dwie kolumny wewnątrz adresu. Chcę wstawić wiersz osoby do tabeli osoby, jeśli nie, nie wstawiaj do tabeli adresowej. Ten xml może być bardzo duży. Jakie jest najlepsze rozwiązanie?

+0

Spróbuj https://forums.oracle.com/forums/thread.jspa?messageID=10269899 – user75ponic

+0

mam trochę inny drzewo xml, pls help :) http://stackoverflow.com/questions/18583872/oracle-xml-skip-not-exist-node – zrosystem

Odpowiedz

23

Można załadować dokument XML do XMLType, a następnie zapytać go, np .:

DECLARE 
    x XMLType := XMLType(
    '<?xml version="1.0" ?> 
<person> 
    <row> 
     <name>Tom</name> 
     <Address> 
      <State>California</State> 
      <City>Los angeles</City> 
     </Address> 
    </row> 
    <row> 
     <name>Jim</name> 
     <Address> 
      <State>California</State> 
      <City>Los angeles</City> 
     </Address> 
    </row> 
</person>'); 
BEGIN 
    FOR r IN (
    SELECT ExtractValue(Value(p),'/row/name/text()') as name 
      ,ExtractValue(Value(p),'/row/Address/State/text()') as state 
      ,ExtractValue(Value(p),'/row/Address/City/text()') as city 
    FROM TABLE(XMLSequence(Extract(x,'/person/row'))) p 
    ) LOOP 
    -- do whatever you want with r.name, r.state, r.city 
    END LOOP; 
END; 
+0

Może to pomóc, ale jednym wielkim problemem jest to, że mogę nie znać nazwy znacznika, wejście jest dynamiczne xml ze wszystkimi różne nazwy tabel i filmiki – Frank

+3

Cóż, musisz wiedzieć, co to są tagi, inaczej w jaki sposób kod powinien wiedzieć, gdzie wstawić dane? –

+0

Rozwiązałem ten problem za pomocą interfejsu API dbms_xmldom. Dziękuję za pomoc – Frank

6
CREATE OR REPLACE PROCEDURE ADDEMP 
    (xml IN CLOB) 
AS 
BEGIN 
    INSERT INTO EMPLOYEE (EMPID,EMPNAME,EMPDETAIL,CREATEDBY,CREATED) 
    SELECT 
     ExtractValue(column_value,'/ROOT/EMPID') AS EMPID 
     ,ExtractValue(column_value,'/ROOT/EMPNAME') AS EMPNAME 
     ,ExtractValue(column_value,'/ROOT/EMPDETAIL') AS EMPDETAIL 
     ,ExtractValue(column_value,'/ROOT/CREATEDBY') AS CREATEDBY 
     ,ExtractValue(column_value,'/ROOT/CREATEDDATE') AS CREATEDDATE 
    FROM TABLE(XMLSequence(XMLType(xml))) XMLDUMMAY; 

    COMMIT; 
END; 
8
select * 
FROM XMLTABLE('/person/row' 
     PASSING 
      xmltype(' 
       <person> 
        <row> 
         <name>Tom</name> 
         <Address> 
          <State>California</State> 
          <City>Los angeles</City> 
         </Address> 
        </row> 
        <row> 
         <name>Jim</name> 
         <Address> 
          <State>California</State> 
          <City>Los angeles</City> 
         </Address> 
        </row> 
       </person> 
      ') 
     COLUMNS 
      --describe columns and path to them: 
      name varchar2(20) PATH './name', 
      state varchar2(20) PATH './Address/State', 
      city varchar2(20) PATH './Address/City' 
    ) xmlt 
; 
+0

Gdy mam wiele tagów adresu wewnątrz , to się nie uda. Co powinienem zmodyfikować, aby przeglądać wiele tagów o tej samej nazwie? Proszę o pomoc – Murali

+0

Jeśli chcesz uzyskać dostęp do pierwszego, to xpath będzie wyglądać tak: './Address[1]/City' – daggett

2

Musisz napisać dużo kodu do przetwarzania złożonych plików XML z Oracle. Jeśli masz duże woluminy XML, wydajność może być również problemem. Analizatory składni XML klasy korporacyjnej umożliwiają przetwarzanie dużych woluminów złożonych plików XML w formacie relacyjnym bez pisania jakiegokolwiek kodu. Ten blog post pokazuje jak bulk load complex XML files to Oracle bez konieczności pisania kodu

Powiązane problemy