EXISTSNODE |
Noeud existe? |
|---|---|
| Oracle Database SQL | Oracle 9i ou supérieure |
Syntaxe
| EXISTSNODE(XMLTypeInstance,XPath,namespace) |
Paramètres
| Nom | Description |
|---|---|
| XMLTypeInstance | Ce paramètre permet d'indiquer l'instance de XMLType. |
| XPath | Ce paramètre permet d'indiquer un ou plusieurs noeud(s) à vérifier. |
| namespace | Ce paramètre permet d'indiquer l'espace de nom. |
Description
Cette fonction permet d'indiquer si le noeud spécifié existe dans le chemin du document XML.
Remarques
- Vérification simple d'existence de nouds XML : La fonction EXISTSNODE permet d'évaluer si un ou plusieurs nouds spécifiés par une expression XPath existent dans un document XML de type XMLType. Elle retourne 1 si le noud est trouvé, sinon 0. Cela en fait un outil pratique pour des requêtes conditionnelles basées sur la structure XML. On peut ainsi intégrer des conditions XML directement dans une clause WHERE, simplifiant certaines requêtes analytiques. Cette approche est cependant limitée à XPath 1.0, ce qui peut restreindre la flexibilité sur des structures XML complexes. Elle est donc plus adaptée aux documents avec des hiérarchies simples.
- Nécessite le type de données XMLType : EXISTSNODE fonctionne uniquement avec les objets de type XMLType. Il ne peut pas directement analyser une chaîne XML entreposée en tant que CLOB, VARCHAR2 ou BLOB sans transformation préalable. Il est donc nécessaire de convertir la donnée à l'aide de XMLType() si elle n'est pas déjà dans le bon format. Cette dépendance rend son usage moins universel. Cependant, XMLType reste le format natif optimisé pour les traitements XML dans Oracle. Le respect de cette contrainte garantit une meilleure performance dans l'évaluation XPath.
- Retourne un entier (0 ou 1), pas un booléen : Contrairement à certaines fonctions de type booléen, EXISTSNODE retourne une valeur entière : 1 si le noud XPath existe, 0 sinon. Il ne lève pas d'erreur si le noud est absent, ce qui facilite les requêtes robustes. Cette sortie numérique peut être utilisée directement dans des filtres SQL ou dans des colonnes calculées. Elle permet aussi des tests combinés, par exemple avec des opérateurs arithmétiques. Néanmoins, son résultat binaire la rend moins expressive que des fonctions XML plus modernes comme XMLEXISTS.
- Fonction désormais dépréciée : Oracle a officiellement déprécié la fonction EXISTSNODE à partir d'Oracle 12c, bien qu'elle soit toujours disponible dans les versions ultérieures pour assurer la compatibilité ascendante. Cela signifie qu'elle ne devrait plus être utilisée dans de nouveaux développements. Son remplacement recommandé est XMLEXISTS, qui offre une meilleure compatibilité avec les standards SQL/XML et une plus grande souplesse pour les espaces de noms. Cette évolution reflète la volonté d'Oracle d'aligner ses fonctions XML sur les normes industrielles modernes. Il est donc conseillé de migrer les anciens usages de EXISTSNODE vers XMLEXISTS.
- Sensible aux espaces de noms XML : Le paramètre namespace est crucial pour l'évaluation correcte des nouds XPath dans un document XML avec des espaces de noms. Si un espace de noms est défini dans le document mais non pris en compte dans l'appel à EXISTSNODE, la recherche échouera silencieusement. Il est donc impératif de toujours déclarer les espaces de noms utilisés dans le XPath, même pour les tests d'existence simples. La fonction autorise la déclaration multiple de préfixes via une chaîne de texte bien formatée (xmlns:prefix="URI"). Cette gestion manuelle rend la fonction plus difficile à maintenir et sujette aux erreurs, surtout pour des documents XML complexes.
- Prend en charge XPath 1.0 uniquement : EXISTSNODE ne prend en charge que les expressions XPath de la version 1.0. Cela signifie qu'elle ne peut pas utiliser les fonctions avancées de XPath 2.0 ou 3.1, comme les filtres puissants, les fonctions de type matches() ou la navigation plus fine dans les structures. Cette limitation réduit sa capacité à manipuler efficacement les documents XML modernes. En revanche, pour des structures simples ou pour tester uniquement la présence de balises, XPath 1.0 est suffisant. C'est l'une des raisons pour lesquelles Oracle pousse vers XMLEXISTS, qui a un support beaucoup plus évolué.
- Fonction non déterministe en cas d'erreur XPath : Si le XPath fourni est mal formé ou si l'espace de noms est mal défini, EXISTSNODE peut retourner une erreur ou NULL, sans message explicite. Cette nature non déterministe rend difficile le débogage. Une mauvaise déclaration de namespace ou un oubli d'accolades peut faire échouer silencieusement l'évaluation. Il est donc recommandé de toujours tester les XPath utilisés manuellement sur de petits exemples avant de les intégrer dans des requêtes complexes. Cela améliore la fiabilité globale de l'utilisation de la fonction.
- Facilement combinable avec des clauses WHERE : L'un des avantages majeurs de EXISTSNODE est sa capacité à être utilisée directement dans les clauses WHERE ou CASE WHEN. Cela permet de filtrer des lignes selon la présence ou non de certaines balises ou attributs XML. On peut, par exemple, extraire tous les contrats clients contenant un noeud <resiliation> simplement avec WHERE EXISTSNODE(xml_col, '/contrat/resiliation') = 1. Cette intégration fluide avec SQL standard en fait un outil simple pour des conditions basées sur XML.
- Compatible avec les index XMLType : Lorsqu'utilisé sur une colonne de type XMLType stockée en mode binary XML, EXISTSNODE peut tirer parti d'index structurés XML (XMLIndex) pour accélérer les requêtes. Cela permet d'obtenir de très bonnes performances sur de grands volumes de documents XML. Pour cela, il est nécessaire de bien configurer les index XPath ou structurels. Toutefois, ce n'est pas automatique et requiert une bonne maîtrise des options de stockage XML dans Oracle. En l'absence d'index, l'évaluation XPath est toujours faite en lecture séquentielle.
- Fonction toujours utilisée pour raisons de compatibilité : Malgré sa dépréciation, EXISTSNODE reste très utilisé dans les projets Oracle historiques ou les migrations depuis Oracle 9i/10g/11g. Cela s'explique par sa simplicité d'usage et son intégration native aux premières versions XML de la base. Ainsi, de nombreuses applications critiques reposent encore sur cette fonction. Lors de la modernisation d'un système Oracle, il faut donc tenir compte de sa présence et prévoir une stratégie de migration progressive vers XMLEXISTS ou XMLQUERY.
- Permet l'utilisation conjointe de plusieurs XPath : La fonction permet de tester plusieurs XPath simultanément en les combinant avec or ou | dans l'expression. Cela permet de vérifier si au moins un noud parmi plusieurs possibles est présent dans un même document XML. Par exemple : EXISTSNODE(doc, '/a/b | /x/y') retournera 1 si l'un des deux chemins existe. Cela évite de multiplier les appels à la fonction et optimise les conditions logiques. C'est particulièrement utile quand un document XML peut suivre des structures légèrement variables.
- Incompatibilité avec certains types d'entreposage : EXISTSNODE n'est pas compatible avec tous les modes de stockage XML proposés par Oracle, notamment les SecureFiles LOB ou certains stockages en CLOB sans conversion préalable. Il faut donc s'assurer que la donnée XML est bien stockée dans un XMLType, avec une structure accessible en XPath. Pour les CLOB/XML dynamiques générés à la volée, il faut passer par XMLType(clob_col) pour que la fonction fonctionne correctement. Cette contrainte technique limite la souplesse dans des architectures hybrides ou orientées services.
Voir également
Article - Les géants de l'informatique - Oracle
Dernière mise à jour : Lundi, le 11 mai 2015