web-dev-qa-db-fra.com

Oracle 10g: Extraire des données (sélectionner) à partir de XML (type CLOB)

Je suis nouveau dans Oracle et j'ai - peut-être trivial - un problème dans une sélection. (J'utilise Oracle 10g Express Edition).

J'ai une base de données avec un champ CLOB: mytab.xml Cette colonne a un XML comme celui-ci:

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

J'essaie de faire un "simple" sélection pour obtenir, par exemple, la valeur de la balise "fax". Mais j'ai un petit problème et je ne peux pas comprendre mon erreur. Par exemple:

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

J'ai aussi essayé avec 'extractvalue', mais j'ai les mêmes problèmes… où je me trompe?

12
mymark

Essayez ceci à la place:

select xmltype(t.xml).extract('//fax/text()').getStringVal() from mytab t
28
dogbane

Essayez d'utiliser xmltype.createxml(xml).

Un péché, 

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

Cela a fonctionné pour moi.

Si vous voulez améliorer ou manipuler encore plus loin.

Essayez quelque chose comme ça.

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

J'espère que ça aide quelqu'un. 

3
Silva

Vous pouvez essayer de créer un objet DBMS_XMLPARSER.parser à partir du XML CLOB et obtenir un objet DBMS_XMLDOM.DOMDocument. Utilisez ensuite les méthodes de package DBMS_XMLDOM pour obtenir la valeur de n’importe quel noeud. 

   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);

Ensuite, utilisez les méthodes ci-dessous pour extraire la valeur du nœud

DBMS_XMLDOM.getElementsByTagName (doc_, 'NodeName'); DBMS_XMLDOM.GetNodeValue (node_obj_);

Reportez-vous davantage sur les méthodes DBMS_XMLDOM ici

0
S.Roshanth

En cas de : 

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

Requête:

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
0
O'sama

cette requête fonctionne parfaitement dans mon cas

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