2015-05-29 9 views
9

से डेटा निकालना XMLTABLE और XQuery का उपयोग करते हुए मैं एक्सएमएल का निम्न भाग है:एक्सएमएल

<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd" 
    xmlns:per="http://www.something.com/2014/11/bla/person"> 
    <per:Initials>E.C.</per:Initials> 
    <per:FirstName>Erik</per:FirstName> 
    <per:LastName>Flipsen</per:LastName> 
    <per:BirthDate>1980-07-01</per:BirthDate> 
    <per:Gender>Male</per:Gender> 
</per:Person> 

इस एक्सएमएल मैं PL/SQL में कुछ डेटा निकालना चाहते हैं से। मैं XMLTABLE का उपयोग करना चाहता हूं, क्योंकि EXTRACT और EXTRACTVALUE फ़ंक्शंस को बहिष्कृत किया गया है।

मैं इस क्वेरी का उपयोग कर डेटा निकालने में सक्षम हूँ: के बाद से मैं वास्तव में परवाह नहीं है क्या संक्षिप्ताक्षर भेजने पार्टी नाम स्थान के लिए उपयोग कर रहा है, मुझे पता है

select pers.Initials, 
     pers.Firstname 
    into lsInitials, 
     lsFirstname 
    from 
    XMLTABLE ('*:Person' passing pxRequest 
    columns Initials   PATH '*:Initials', 
      Firstname   PATH '*:FirstName' 
    ) pers; 

मैं नामस्थान के लिए वाइल्डकार्ड का उपयोग कर रहा वैसे भी सही डेटा जहां मेरा डेटा प्राप्त करना है। तथापि http://docs.oracle.com/database/121/SQLRF/functions268.htm#SQLRF06232 पथ पर दस्तावेज़ीकरण वैकल्पिक किया जाना चाहिए के अनुसार

  • , जैसे ही मैं कॉलम अनुभाग से पथ को हटाने के रूप में, मैं नहीं:

    इस कोड के साथ

    मैं दो चीजें हैं जो मुझे पहेली है अब कोई परिणाम प्राप्त करें।

संपादित करें:

मुझे पता चला कि जब मैं तत्वों के लिए नामस्थान निकालने के लिए, और उन्हें अपरकेस बनाया है, यह काम करता है। तो ऐसा लगता है कि कॉलम नामों को इसे काम करने के लिए एक्सएमएल तत्वों के नामों से मेल खाना चाहिए। मैंने अभी तक यह पता नहीं लगाया कि इसे नामांकित एक्सएमएल के साथ कैसे काम करना है।

  • प्रलेखन यह भी नोट करता है कि "ऑर्डिनेलिटी कॉलम को छोड़कर प्रत्येक परिणामी कॉलम के लिए, आपको कॉलम डेटा प्रकार निर्दिष्ट करना होगा", हालांकि, ऐसा लगता है कि यह ठीक काम करता है। यह कॉलम के लिए निर्दिष्ट करने के लिए थोड़ा अनावश्यक लगता है और वे चर के लिए जो मैं डेटा ला रहा हूं। यदि कोई डेटा प्रकार निर्दिष्ट नहीं करता है तो मुझे कोई समस्या हो सकती है?

Runnable कोड नमूना:

SET SERVEROUTPUT ON; 
DECLARE 

    pxRequest xmltype := xmltype('<per:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://www.something.com/2014/11/bla/webservice.xsd" 
            xmlns:per="http://www.something.com/2014/11/bla/person"> 
            <per:Initials>E.C.</per:Initials> 
            <per:FirstName>Erik</per:FirstName> 
            <per:LastName>Flipsen</per:LastName> 
            <per:BirthDate>1980-01-01</per:BirthDate> 
            <per:Gender>Male</per:Gender> 
           </per:Person>'); 
    lsInitials varchar2(100); 
    lsFirstname varchar2(100);         


begin 

    select pers.Initials, 
      pers.Firstname 
     into lsInitials, 
      lsFirstname 
     from 
     XMLTABLE ('*:Person' passing pxRequest 
     columns Initials   PATH '*:Initials', 
       Firstname   PATH '*:FirstName' 
     ) pers; 


    dbms_output.put_line(lsInitials); 
    dbms_output.put_line(lsFirstname); 

end;        

उत्तर

1

अपने पहले प्रश्न के अनुसार, the documentation you linkedPATH को छोड़ते हुए के बारे में दिन के लिए इस है:

वैकल्पिक PATH खंड निर्दिष्ट करता है कि XQuery परिणाम वाले हिस्से की XQuery अभिव्यक्ति स्ट्रिंग द्वारा संबोधित किया जाता है के रूप में इस्तेमाल किया जा रहा है कॉलम सामग्री।

यदि आप PATH छोड़ देते हैं, तो XQuery अभिव्यक्ति कॉलम माना जाता है। उदाहरण के लिए:

(... COLUMNS xyz)

XMLTable(... COLUMNS xyz PATH 'XYZ')

आप XQuery अलग आभासी-तालिका स्तंभ में परिणाम विभाजित करने के लिए अलग रास्ता खंड का उपयोग कर सकते के बराबर है।

कारण स्तंभ xyz होने की 'XYZ' है क्योंकि ओरेकल, डिफ़ॉल्ट रूप से, केस संवेदी (सभी टोपियां के लिए चूक) है माना जाता है। आप "aBcD" के रूप में अपने स्तंभ में परिभाषित किया गया था तो PATH मूल्य 'aBcD'


डेटा प्रकार को निर्दिष्ट करने के बारे में अपने दूसरे प्रश्न का सवाल है माना जा जाएगा: यदि डेटा आप निकालने रहे हैं हमेशा पाठ डेटा होने जा रहा है, आप डेटा प्रकार निर्दिष्ट न करने में सक्षम हो सकते हैं।

हालांकि, यदि आप तिथियों, टाइमस्टैम्प, फ़्लोटिंग पॉइंट नंबर इत्यादि जैसी चीजों से निपटना शुरू करते हैं, तो आप मुद्दों में भाग ले सकते हैं। आपको या तो TO_* फ़ंक्शंस का उपयोग करके उन्हें मैन्युअल रूप से रूपांतरित करने की आवश्यकता होगी या आप कॉलम परिभाषाओं में अपने डेटा प्रकार निर्दिष्ट कर सकते हैं। यदि आप नहीं करते हैं, तो ओरेकल इसे स्पष्ट रूप से डालने के लिए स्वतंत्र है, हालांकि यह उपयुक्त लगता है, जिसके अप्रत्याशित परिणाम हो सकते हैं।

1

संदर्भ:

https://stackoverflow.com/a/9976068/377141

How to parse xml by xmltable when using namespace in xml(Oracle)

यह काम करना चाहिए की उम्मीद के रूप में यदि आप अपने xmltable में नाम स्थान तत्वों में लोड:

select results  
from xmltable( 
    xmlnamespaces(
    default 'http://tempuri.org/',  
    'http://schemas.xmlsoap.org/soap/envelope/' as "soap" 
),  
    'soap:Envelope/soap:Body/addResponse' passing xmltype(v_xml) 
    columns results varchar(100) path './addResult') 
अपने उदाहरण से

(आप भी अपने स्कीमा/नाम स्थान में समय से पहले रजिस्टर करने के लिए आवश्यकता हो सकती है, लेकिन है कि एक बार होना चाहिए):

select pers.Initials, 
     pers.Firstname 
    into lsInitials, 
     lsFirstname 
    from 
    XMLTABLE (
     xmlnamespaces(
     default 'http://tempuri.org/', 
     'http://www.w3.org/2001/XMLSchema-instance' as "xsi", 
     'http://www.something.com/2014/11/bla/person' as "per" 
    ), 
    passing pxRequest 
    columns Initials   PATH '*:Initials', 
      Firstname   PATH '*:FirstName' 
    ) pers; 

चीज़ें है कि ओरेकल के पिछले संस्करणों में काम करने के लिए काम नहीं करते इस्तेमाल किया एक्सएमएल के संबंध में 11 जी + में, जैसा कि मैंने देखा है, ओरेकल एक्सएमएल ऑपरेशंस के इनपुट/आउटपुट को दृढ़ता से सत्यापित/टाइप करता है, जहां पिछले संस्करणों में आप नेमस्पेस जानकारी के बिना सामान्य उचित XQuery संचालन चला सकते हैं।