Votre XML mis à jour a un espace de noms, qui révèle enfin le problème. Vous devez spécifier le espace de noms dans le cadre de l'extraction XML , qui est plus simple avec l'approche XMLTable ; dans ce cas, vous pouvez simplement le traiter comme l'espace de noms par défaut :
select itc.element_name, x.user_classification3
from i_transaction itc
cross join xmltable(
xmlnamespaces(default 'http://xmlns.oracle.com/apps/otm'),
'/TenderOffer/Shipment/RATE_OFFERING/RATE_OFFERING_ROW'
passing xmltype(itc.xml_blob)
columns user_classification3 varchar2(10) path 'USER_CLASSIFICATION3'
) x
where itc.i_transaction_no = 31553115
and rownum = 1;
ELEMENT_NA USER_CLASS
---------- ----------
dummy ZXF
ou avec XMLQuery :
select itc.element_name, xmlquery(
'declare default element namespace "http://xmlns.oracle.com/apps/otm"; (: :)
/TenderOffer/Shipment/RATE_OFFERING/RATE_OFFERING_ROW/USER_CLASSIFICATION3/text()'
passing xmltype(itc.xml_blob)
returning content
) x
from i_transaction itc
where itc.i_transaction_no = 31553115
and rownum = 1;
ELEMENT_NA X
---------- --------------------------------------------------------------------------------
dummy ZXF
Si vous vouliez continuer à utiliser le extractvalue()
obsolète fonction, vous pouvez également fournir l'espace de noms comme argument, encore une fois comme indiqué dans la documentation
:
select itc.element_name,
extractvalue(xmltype(xml_blob),
'/TenderOffer/Shipment/RATE_OFFERING/RATE_OFFERING_ROW/USER_CLASSIFICATION3/text()',
'xmlns="http://xmlns.oracle.com/apps/otm"')
from i_transaction itc where itc.i_transaction_no = 31553115 and rownum = 1;