2012-10-19 33 views
17

Làm thế nào để tải một tệp xml lồng nhau vào bảng cơ sở dữ liệu?oracle plsql: cách phân tích cú pháp XML và chèn vào bảng

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

Trong tên xml này, tên là tên bảng, Tom là giá trị được gửi. Địa chỉ là một subtable và tiểu bang và thành phố là hai cột bên trong Address. Tôi muốn chèn hàng người vào bảng người, nếu nó không thành công, không chèn vào bảng địa chỉ. Xml này có thể rất lớn. Giải pháp tốt nhất để làm điều này là gì?

+0

Hãy thử https://forums.oracle.com/forums/thread.jspa?messageID=10269899 – user75ponic

+0

này tôi đã nhận ít cây xml khác nhau, xin giúp đỡ :) http://stackoverflow.com/questions/18583872/oracle-xml-skip-not-exist-node – zrosystem

Trả lời

23

Bạn có thể tải một tài liệu XML thành một XMLType, sau đó truy vấn nó, ví dụ .:

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

Điều này có thể hữu ích, nhưng một vấn đề lớn là tôi có thể không biết tên thẻ, đầu vào là xml động với tất cả tên bảng và các tờ khác nhau – Frank

+3

Vâng, bạn cần phải biết các thẻ là gì, nếu không thì mã được cho là biết phải chèn dữ liệu vào đâu? –

+0

Tôi đã giải quyết vấn đề này bằng cách sử dụng API dbms_xmldom. Cảm ơn sự giúp đỡ của bạn – 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

Khi tôi có nhiều thẻ Địa chỉ bên trong số thì không thành công. Tôi nên sửa đổi gì để lặp qua nhiều thẻ có cùng tên? Vui lòng giúp – Murali

+0

Nếu bạn muốn truy cập trang đầu tiên, thì xpath sẽ giống như sau: './Address[1]/City' – daggett

2

Bạn sẽ cần phải viết rất nhiều mã để xử lý file XML phức tạp với Oracle. Nếu bạn có khối lượng lớn XML thì hiệu năng cũng có thể là một mối quan ngại. Các trình phân tích cú pháp XML cấp doanh nghiệp sẽ cho phép bạn xử lý một lượng lớn các tệp XML phức tạp thành một định dạng quan hệ mà không cần viết bất kỳ mã nào. bài viết trên blog này cho thấy làm thế nào để bulk load complex XML files to Oracle mà không cần viết bất kỳ mã

Các vấn đề liên quan