2011-02-03 18 views
10

मैं ओरेकल में नया हूं और मैंने - शायद तुच्छ - एक चयन में एक समस्या है। (मैं ओरेकल 10 जी एक्सप्रेस संस्करण का उपयोग कर रहा हूँ)।ओरेकल 10 जी: एक्सएमएल (सीएलओबी प्रकार) से डेटा (चयन) निकालें

मैं एक क्षेत्र CLOB के साथ एक DB है: mytab.xml यह कॉलम इस तरह एक एक्सएमएल है:

<?xml version="1.0" encoding="iso-8859-1"?> 
<info> 
<id> 954 </id> 
<idboss> 954 </idboss> 
<name> Fausto </name> 
<sorname> Anonimo </sorname> 
<phone> 040000000 </phone> 
<fax> 040000001 </fax> 
</info> 

मैं एक 'सरल' करने के लिए कोशिश कर रहा हूँ प्राप्त करने के लिए का चयन करें, उदाहरण के लिए, 'फैक्स' टैग का मूल्य। लेकिन मुझे कुछ समस्या है और मैं अपनी त्रुटि को समझने में सक्षम नहीं हूं। उदाहरण के लिए:

select extract(xml, '//fax').getStringVal() from mytab; 
ORA-00932: inconsistent datatypes: expected - got 

select extract(xmltype(xml), '//fax').getStringVal() from mytab; 
ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at "SYS.XMLTYPE", line 254 

मैंने 'extractvalue' के साथ भी कोशिश की है, लेकिन मुझे एक ही समस्या है। जहां मुझे यह करना गलत है?

उत्तर

27

ऐसा करें:

select xmltype(t.xml).extract('//fax/text()').getStringVal() from mytab t 
+0

अभी तक नहीं: ORA-06,502: PL/SQL: सांख्यिक या मूल्य त्रुटि ORA-06512: "SYS.XMLTYPE" पर, लाइन 254 ओआरए -06512: लाइन 1 – mymark

+0

क्षमा करें .... हाँ, आपका उत्तर पूरी तरह से काम करता है! पिछले मामले में मुझे एक एक्सएमएल शून्य ^^ मिला है! – mymark

+0

11 जी में मैं '.getStringVal()' -part out छोड़ सकता हूं। 10 जी के बारे में कोई विचार नहीं है क्योंकि मेरे पास कोई भी नहीं है। – user272735

3

xmltype.createxml(xml) का उपयोग करें।

में के रूप में,

select extract(xmltype.createxml(xml), '//fax').getStringVal() from mytab; 

यह मेरे लिए काम किया।

यदि आप और भी सुधार करना चाहते हैं या छेड़छाड़ करना चाहते हैं।

इस तरह कुछ कोशिश करें।

Select * 
from xmltable(xmlnamespaces('some-name-space' as "ns", 
            'another-name-space' as "ns1", 
          ), 
        '/ns/ns1/foo/bar' 
        passing xmltype.createxml(xml) 
        columns id varchar2(10) path '//ns//ns1/id', 
          idboss varchar2(500) path '//ns0//ns1/idboss', 
          etc.... 

        ) nice_xml_table 

आशा है कि यह किसी की सहायता करे।

0

इस क्वेरी मेरे मामले में पूरी तरह से चलाता है

select xmltype(t.axi_content).extract('//Lexis-NexisFlag/text()').getStringVal() from ax_bib_entity t 
0

आप नीचे दिए गए के साथ प्राप्त कर सकते हैं प्रश्नों

  1. select extract(xmltype(xml), '//fax/text()').getStringVal() from mytab;

  2. select extractvalue(xmltype(xml), '//fax') from mytab;

0

आप CLOB XML से DBMS_XMLPARSER.parser ऑब्जेक्ट बनाने का प्रयास कर सकते हैं और इससे DBMS_XMLDOM.DOMDocument ऑब्जेक्ट प्राप्त कर सकते हैं। फिर किसी भी नोड के मान प्राप्त करने के लिए DBMS_XMLDOM पैकेज विधियों का उपयोग करें।

xml_   CLOB := 'X'; 
    p    DBMS_XMLPARSER.parser; 
    doc_   DBMS_XMLDOM.DOMDocument; 

     -- Convert the CLOB into a XML-document 
     P := DBMS_XMLPARSER.newparser(); 
     -- Parse the clob and get the XML-document 
     DBMS_XMLPARSER.parseclob(p, xml_); 
     doc_ := DBMS_XMLPARSER.getDocument(p); 

फिर नोड मूल्य

DBMS_XMLDOM.getElementsByTagName (doc_, 'nodename') को निकालने के लिए नीचे दिए गए तरीकों का उपयोग करें; डीबीएमएस_एक्सएमएलएमओएम.गेटनोड वैल्यू (node_obj_);

डीबीएमएस_एक्सएमएलडीओएम विधियों here के बारे में और अधिक देखें।

0

के मामले में:

<?xml version="1.0" encoding="iso-8859-1"?> 
<info xmlns="http://namespaces.default" xmlns:ns2="http://namespaces.ns2" > 
    <id> 954 </id> 
    <idboss> 954 </idboss> 
    <name> Fausto </name> 
    <sorname> Anonimo </sorname> 
    <phone> 040000000 </phone> 
    <fax> 040000001 </fax> 
</info> 

क्वेरी:

Select * 
from xmltable(xmlnamespaces(default 'http://namespaces.default' 
           'http://namespaces.ns2' as "ns", 
         ), 
       '/info' 
       passing xmltype.createxml(xml) 
       columns id varchar2(10) path '/id', 
         idboss varchar2(500) path '/idboss', 
         etc.... 

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