SQL*Plus et XQUERY

Oracle SQL*Plus 10.2 a introduit une fonctionnalité très sympa : la possibilité d’écrire vos requêtes XQUERY directement depuis le prompt de l’utilitaire en ligne. Je me suis un peu battu pour comprendre comment passer des structures XML sans créer un document et l’enregistrer ou le référencer depuis la base de données. Voici quelques exemples qui vous inspirerons à n’en pas douter. Il faut dire que la documentation de la syntaxe SQL*Plus est assez succincte.

La commande xquery

Une bonne façon de commencer est de lancer SQL*Plus et de demander de l’aide comme ci-dessous :

help xquery
XQUERY
------

Performs an XQuery 1.0 query on a specified database. Attempting to use
XQUERY on a database earlier than Oracle Database 10g (Release 2) generates
an error.

XQUERY xquery_statement

Essayons maintenant une nouvelle stratégie…

Exemple 1 : utiliser ora:view

ora:view est une fonction XPath personnalisée par Oracle pour transformer une vue ou une table en document XML… Utilisée avec XQuery, vous pouvez par exemple visualiser le contenu de user_objects avec XQUERY comme ci-dessous :

xquery
for $i in ora:view("user_objects")
return $i/ROW/OBJECT_NAME/text()
/

Si vous voulez fixer le XML servant comme source à votre requête comme le fait le mot clé passing de la fonction XMLQUERY, vous pouvez également utiliser la syntaxe set xquery context comme ci-dessous :

set xquery context 'ora:view("user_objects")'
xquery
for $i in /ROW/OBJECT_NAME/text()
return $i
/
set xquery context ''

Exemple 2: XML à la main

Si vous ne voulez pas travailler sur la base de données mais sur vos fichiers XML, il suffira de les enregistrer dans XML Database. Toutefois pour des exemples rapide, regardez les syntaxes ci-dessous :

set xquery context '<oops><x>1</x><y>2</y></oops>'
xquery
for $i in /oops/*
return $i
/

Ou si vous voulez utiliser des espaces de nommage

set xquery context '<oops xmlns="https://easyteam.fr/demo"> -
<x>1</x> -
<y>2</y> -
</oops>'
xquery
declare default element namespace "https://easyteam.fr/demo";
for $i in /oops/*
return $i
/
set xquery context ''

Un truc en plus… 10046

Pour bien comprendre l’utilisation que fait XQUERY et décortiquer ce qui est possible ou pas, je vous conseille d’utiliser la trace 10046 ou dbms_monitor; vous découvrirez que le dernier exemple exécute en réalité la commande suivante sur ma base de données Oracle 11.2 :

SELECT COLUMN_VALUE RESULT_PLUS_XQUERY FROM XMLTABLE('declare default element namespace "https://easyteam.fr/demo";
for $i in /oops/*
return $i' passing xmlquery('<oops xmlns="https://easyteam.fr/demo"><x>1</x><y>2</y></oops>' returning content))