Oracle
 sql >> Base de données >  >> RDS >> Oracle

Impossible d'extraire les résultats en transmettant l'entrée en tant que chemin xml dans oracle

En supposant que vous essayez de filtrer sur un ID dans le XML, vous avez un problème de syntaxe, vous avez fourni le nœud racine comme ActivityId au lieu d'Activity, vous ne descendez pas au nœud ID, vous abusez de contains - et ce n'est probablement pas ce que vous voulez de toute façon ; et vous ignorez les espaces de noms.

Cela ne trouvera que les lignes où le XML a un ID spécifique :

SELECT * from activity
where ExtractValue(xml,
  '/Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID/text()',
  'xmlns="urn:astrazeneca:na:Activity:domain:3" xmlns:ns2="urn:astrazeneca:na:CommonTypes:domain:2"'
  ) = 10669;

Mais ExtractValue est obsolète depuis longtemps, vous devez donc utiliser XMLQuery à la place. Ou dans ce contexte, il serait probablement plus logique d'utiliser XMLExists, avec la valeur que vous souhaitez intégrer :

SELECT * from activity
where XMLExists('
    declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
    declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
    /Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=10669]
  '
  passing xml
);

ou peut-être plus utilement fourni comme argument :

SELECT * from activity
where XMLExists('
    declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
    declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
    /Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=$id]
  '
  passing xml, 10669 as "id"
);

db<>violon

Si vous souhaitez ensuite extraire des données spécifiques du XML dans les lignes correspondantes, consultez XMLQuery ou XMLTable - mais c'est un problème distinct.