2012-10-19 20 views
17

डेटाबेस तालिका में नेस्टेड xml फ़ाइल को कैसे लोड करें?ऑरैक plsql: XML को पार्स करने और तालिका में डालने के लिए

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

इस एक्सएमएल में, व्यक्ति तालिका का नाम है, नाम दायर नाम है, टॉम इसका दायर मूल्य है। पता एक उप-विषय है और राज्य और शहर पता के अंदर दो कॉलम है। मैं व्यक्तिगत पंक्ति में व्यक्ति पंक्ति को सम्मिलित करना चाहता हूं, अगर यह विफल हुआ, तो पता तालिका में सम्मिलित न करें। यह एक्सएमएल बहुत बड़ा हो सकता है। ऐसा करने का सबसे अच्छा समाधान क्या है?

+0

प्रयास करें इस https://forums.oracle.com/forums/thread.jspa?messageID=10269899 – user75ponic

+0

मैं थोड़ा अलग एक्सएमएल पेड़ मिला है, कृपया मदद :) http://stackoverflow.com/questions/18583872/oracle-xml-skip-not-exist-node – zrosystem

उत्तर

23

आप उदाहरण के लिए: एक XMLType में एक XML दस्तावेज लोड कर सकते हैं, तो यह क्वेरी, .:

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

इससे मदद मिल सकती है, लेकिन एक बड़ी समस्या यह है कि मुझे टैग नाम नहीं पता है, इनपुट सभी के साथ गतिशील xml है विभिन्न टेबल नाम और फिल्में – Frank

+3

ठीक है, आपको यह जानने की ज़रूरत है कि टैग क्या हैं, अन्यथा यह कोड कैसे पता होना चाहिए कि डेटा कहां डालना है? –

+0

मैंने dbms_xmldom API का उपयोग करके इस समस्या को हल किया है। आपकी मदद के लिए धन्यवाद – 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

जब मेरे पास के अंदर एकाधिक पता टैग हैं तो यह असफल हो रहा है। मुझे एक ही नाम से एकाधिक टैग्स के माध्यम से लूप में क्या संशोधित करना चाहिए? कृपया – Murali

+0

की सहायता करें यदि आप पहले तक पहुंचना चाहते हैं, तो xpath इस तरह होगा: './ddress[1 ]/City' – daggett

2

आप Oracle के साथ जटिल एक्सएमएल फाइल पर कार्रवाई करने के कोड का एक बहुत कुछ लिखने के लिए की आवश्यकता होगी। यदि आपके पास एक्सएमएल की बड़ी मात्रा है तो प्रदर्शन भी चिंता का विषय हो सकता है। एंटरप्राइज़ ग्रेड एक्सएमएल पार्सर्स आपको किसी भी कोड को लिखने के बिना जटिल एक्सएमएल फाइलों की बड़ी मात्रा को एक रिलेशनल प्रारूप में संसाधित करने देगा। इस ब्लॉग पोस्ट दिखाता है कि कैसे bulk load complex XML files to Oracle के लिए किसी भी कोड लिखने के बिना

संबंधित मुद्दे