Les fonctions de recherche de l'Extension XML permettent d'effectuer des recherches dans une colonne XML d'après la structure du document (éléments ou attributs). Pour ce faire, vous utilisez une instruction SELECT de plusieurs façons et vous obtenez en retour un ensemble de résultats basé sur les analogies avec les éléments ou les attributs du document. Vous pouvez utiliser les méthodes de recherche suivantes :
Ces méthodes sont décrites dans les sections suivantes et comportent des exemples utilisant le scénario ci-après. La table d'application SALES_TAB comporte une colonne XML intitulée ORDER. Cette colonne contient trois tables annexes, ORDER_SIDE_TAB, PART_SIDE_TAB et SHIP_SIDE_TAB. La vue par défaut sales_order_view, indiquée lors de l'activation de la colonne ORDER, réalise la jointure de ces tables par l'instruction CREATE VIEW :
CREATE VIEW sales_order_view(invoice_num, sales_person, order, order_key, customer, part_key, price, date) AS SELECT sales_tab.invoice_num, sales_tab.sales_person, sales_tab.order, order_side_tab.order_key, order_side_tab.customer, part_side_tab.part_key, ship_side_tab.date FROM sales_tab, order_side_tab, part_side_tab, ship_side_tab WHERE sales_tab.invoice_num = order_side_tab.invoice_num AND sales_tab.invoice_num = part_side_tab.invoice_num AND sales_tab.invoice_num = ship_side_tab.invoice_num
L'interrogation directe par sous-requêtes fournit les meilleures performances pour la recherche structurelle lorsque les tables annexes sont indexées. Les requêtes ou les sous-requêtes permettent d'effectuer des recherches correctes dans les tables annexes.
Exemple : L'instruction ci-après exécute une recherche directe dans une table annexe par une requête ou une sous-requête :
SELECT sales_person from sales_tab WHERE invoice_num in (SELECT invoice_num from part_side_tab WHERE price > 2500.00 )
Dans cet exemple, invoice_num représente la clé primaire de la table SALES_TAB.
L'Extension XML peut créer une vue par défaut qui réalise une jointure de la table d'application et des tables annexes par un identificateur unique. A l'aide de cette vue par défaut ou de toute vue équivalente, vous pouvez effectuer des recherches dans les données de colonne et interroger les tables annexes. Cette méthode fournit une vue virtuelle unique de la table d'application et de ses tables annexes. Cependant, le coût de la requête est proportionnel au nombre de tables annexes créées.
Astuce : Lors de la création de votre propre vue, vous pouvez réaliser une jointure de tables à l'aide de l'identificateur racine root_id ou de l'identificateur DXXROOT_ID créé par l'Extension XML.
Exemple : L'instruction ci-après exécute une recherche dans une vue :
SELECT sales_person from sales_order_view WHERE price > 2500.00
L'instruction SQL renvoie les valeurs sales_person de la table sales_order_view pour lesquelles les commandes ont un prix supérieur à 2500,00.
Les fonctions UDF d'extraction fournies par l'Extension XML vous permettent également d'effectuer des recherches sur des éléments et des attributs lorsque vous n'avez pas créé d'index ni de table annexe pour la table d'application. L'examen de données XML à l'aide des fonctions UDF d'extraction est très coûteux et ne doit être effectué qu'avec des clauses WHERE limitant le nombre de documents XML concernés.
Exemple : L'instruction ci-après exécute une recherche avec une fonction UDF d'extraction fournie par l'Extension XML :
SELECT sales_person from sales_tab WHERE extractVarchar(order, '/Order/Customer/Name') like '%IBM%' AND invoice_num > 100
Dans cet exemple, la fonction UDF d'extraction extrait les éléments </Order/Customer/Name> contenant la valeur IBM.
Lors des recherches sur des éléments ou des attributs à occurrences multiples, la clause DISTINCT permet d'éviter les valeurs en double.
Exemple : L'instruction ci-après exécute une recherche avec la clause DISTINCT :
SELECT sales_person from sales_tab WHERE invoice_num in (SELECT DISTINCT invoice_num from part_side_tab WHERE price > 2500.00 )
Dans cet exemple, le fichier DAD indique qu'il existe plusieurs occurrences de /Order/Part/Price et crée la table annexe PART_SIDE_TAB correspondante. Celle-ci peut contenir plusieurs lignes associées au même numéro de facture (invoice_num). La clause DISTINCT ne renvoie que des valeurs uniques.