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?
Essayez ceci à la place:
select xmltype(t.xml).extract('//fax/text()').getStringVal() from mytab t
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.
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 .
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
cette requête fonctionne parfaitement dans mon cas
select xmltype(t.axi_content).extract('//Lexis-NexisFlag/text()').getStringVal() from ax_bib_entity t