EXTRACT |
Extraire |
|---|---|
| Oracle Database SQL | Oracle 9i (9.0) ou supérieure |
Syntaxe
| EXTRACT(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) à extraire. |
| namespace | Ce paramètre permet d'indiquer l'espace de nom. |
Description
Cette fonction permet d'extraire l'argument d'un XMLType dans le chemin spécifié et retourne la valeur scalaire du noeud.
Remarques
- Extraction ciblée de fragments XML : La fonction EXTRACT permet d'extraire une portion spécifique d'un document XML entreposé dans une colonne ou une variable de type XMLType. Elle utilise un chemin XPath pour identifier précisément le ou les nouds souhaités. Cela permet de manipuler des fragments XML sans parcourir manuellement l'ensemble du document. Par exemple, on peut extraire uniquement les balises <prix> d'un catalogue XML. C'est utile dans les cas où seule une partie du document est nécessaire pour une opération ou une requête SQL ultérieure.
- Compatibilité avec le type XMLType : La fonction EXTRACT fonctionne exclusivement avec des données de type XMLType. Ce type est introduit pour faciliter le stockage et la manipulation des données XML dans Oracle. Cela signifie qu'elle ne peut pas être utilisée sur des colonnes classiques de type CLOB ou VARCHAR, à moins qu'elles ne soient converties au préalable. L'intégration avec XMLType permet également de garantir la validité structurelle des documents XML analysés.
- Utilisation d'expressions XPath : L'un des grands avantages de EXTRACT est la prise en charge d'expressions XPath standards. Cela permet d'indiquer précisément quel noud ou ensemble de nouds on souhaite récupérer. Par exemple, /livre/titre retournera tous les titres des éléments <livre>. Il est aussi possible de naviguer en profondeur ou d'utiliser des conditions dans le XPath (comme /livre[@lang='fr']). Cela apporte une grande souplesse pour les requêtes XML complexes.
- Sensibilité au contexte du namespace : La fonction accepte un paramètre namespace pour permettre l'évaluation correcte des documents XML utilisant des espaces de noms. Si un namespace est défini dans le document, il doit être correctement déclaré dans la requête. Sinon, les expressions XPath ne retourneront rien. Ce comportement est souvent source d'erreurs lorsqu'on oublie d'ajouter la cartographie du namespace à l'exécution. La précision dans la gestion des namespaces est donc essentielle pour obtenir des résultats corrects.
- Retour sous forme d'XMLType : Le résultat de la fonction EXTRACT est un objet de type XMLType, même si un seul noud est extrait. Cela signifie qu'il ne s'agit pas d'une valeur scalaire (comme une chaîne) mais bien d'un fragment XML. Si l'on souhaite obtenir une valeur texte directement (comme le contenu d'une balise), il faut utiliser EXTRACTVALUE() ou convertir manuellement le résultat via getStringVal() ou autre. Cette distinction entre structure XML et texte est importante dans l'usage de la fonction.
- Fonctionnalité utile dans les requêtes SELECT : EXTRACT peut être utilisée directement dans une requête SELECT pour analyser des colonnes contenant du XML. Cela permet d'interroger dynamiquement des structures XML entreposées dans la base, sans devoir les traiter côté application. Elle est particulièrement utile dans les systèmes intégrant des documents XML semi-structurés (commandes, factures, profils utilisateurs, etc.). C'est donc un outil essentiel dans le traitement SQL natif des données XML.
- Fonction dépréciée dans les versions récentes : À partir d'Oracle 12c et surtout dans Oracle 18c+, la fonction EXTRACT(XMLType) est considérée comme dépréciée. Oracle recommande de privilégier XMLQUERY, XMLTABLE, ou EXISTSNODE selon le besoin. Cela signifie qu'elle reste disponible pour des raisons de rétrocompatibilité mais qu'elle pourrait être supprimée dans de futures versions. Pour les projets récents ou évolutifs, il est donc préférable d'anticiper et d'utiliser les alternatives plus modernes.
- Ne supporte pas XPath 2.0 : La fonction EXTRACT repose sur XPath 1.0, ce qui limite certaines fonctionnalités avancées comme les opérateurs booléens complexes, les comparaisons sur types de données, ou les fonctions comme upper-case(). Les expressions XPath 2.0 ou 3.0 ne sont pas prises en charge. Si une analyse plus sophistiquée est nécessaire, il faudra se tourner vers XMLQUERY, qui propose un support de XQuery et une meilleure expressivité.
- Utilisation dans les vues ou procédures : La fonction peut être utilisée dans des vues, fonctions PL/SQL, procédures stockées ou déclencheurs. Cela permet de centraliser la logique d'extraction XML dans des objets réutilisables. Elle est donc très pratique dans les applications de gestion de contenu XML, pour dériver automatiquement des informations structurées à partir de documents entreposés.
- Syntaxe stricte et erreurs fréquentes : Une mauvaise formulation du XPath ou l'absence de déclaration de namespace provoque souvent des erreurs silencieuses (le résultat est vide, mais sans erreur explicite). Il est donc recommandé de toujours valider les XPath via un outil externe ou de tester la requête pas à pas. L'utilisation de IS NOT NULL après un EXTRACT(...) peut être utile pour diagnostiquer les chemins vides.
- Utilisable avec des namespaces multiples : Lorsqu'un document XML contient plusieurs namespaces, le paramètre namespace doit être spécifié en utilisant une chaîne de mappage (par exemple : 'xmlns:x="http://example.org"'). Cette fonctionnalité permet d'utiliser des préfixes dans les expressions XPath pour naviguer correctement parmi les noeuds. C'est particulièrement important dans les documents XML industriels, juridiques ou normés (comme UBL, XBRL, HL7...).
- Facilité de manipulation dans PL/SQL : En PL/SQL, la fonction EXTRACT peut être utilisée pour lire dynamiquement des portions d'un document XML entreposé dans une variable ou une table. Une fois le fragment extrait, il peut être manipulé avec d'autres méthodes XML (comme .getClobVal() ou .existsNode()). Cela permet une intégration fluide avec la logique métier dans les blocs de traitement PL/SQL.
Voir également
Article - Les géants de l'informatique - Oracle
Dernière mise à jour : Lundi, le 11 mai 2015