Mit den Suchfunktionen des XML Extender können Sie XML-Daten in einer Spalte entsprechend der Dokumentstruktur durchsuchen, also nach Elementen und Attributen. Zum Durchsuchen der Spaltendaten verwenden Sie eine SELECT-Anweisung auf unterschiedliche Arten; zurückgegeben wird ein Ergebnissatz entsprechend den Übereinstimmungen mit den Dokumentelementen und -attributen. Sie können mit folgenden Methoden nach Spaltendaten suchen:
Diese Methoden werden in den folgenden Abschnitten beschrieben; sie verwenden Beispiele aus dem folgenden Szenario. Die Anwendungstabelle SALES_TAB enthält eine XML-Spalte mit dem Namen ORDER. Diese Spalte enthält drei Seitentabellen ORDER_SIDE_TAB, PART_SIDE_TAB und SHIP_SIDE_TAB. Eine Standardsicht, sales_order_view, wurde beim Aktivieren der Spalte ORDER aktiviert; sie verknüpft diese Tabellen mit der folgenden Anweisung 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
Eine Direktabfrage mit einer Suche "Unterabfragen" bietet den besten Durchsatz für eine strukturelle Suche, wenn die Seitentabellen indexiert sind. Für ein korrektes Durchsuchen der Seitentabellen können Sie eine Abfrage oder Unterabfrage verwenden.
Beispiel: Die folgende Anweisung verwendet eine Abfrage und eine Unterabfrage, um eine Seitentabelle direkt zu durchsuchen:
SELECT sales_person from sales_tab WHERE invoice_num in (SELECT invoice_num from part_side_tab WHERE price > 2500.00)
In diesem Beispiel ist invoice_num der Primärschlüssel in der Tabelle SALES_TAB.
Sie können mit dem XML Extender eine Standardsicht erstellen, die die Anwendungstabelle und die Seitentabellen mit einer eindeutigen ID verknüpft. Mit dieser Standardsicht oder jeder anderen Sicht, die Anwendungstabelle und Seitentabellen verknüpft, können Sie Spaltendaten durchsuchen und die Seitentabellen abfragen. Diese Methode bietet eine einzelne virtuelle Sicht der Anwendungstabelle und ihrer Seitentabellen. Je mehr Seitentabellen erstellt werden, desto aufwendiger ist allerdings die Abfrage.
Tip: Sie können die root_id oder DXXROOT_ID (vom XML Extender erstellt) verwenden, um die Tabellen beim Erstellen Ihrer eigenen Sicht zu verknüpfen.
Beispiel: Mit der folgenden Anweisung wird eine Sicht gesucht.
SELECT sales_person from sales_order_view WHERE price > 2500.00
Die SQL-Anweisung gibt die Werte von sales_person aus der verknüpften Sicht sales_order_view zurück, die Bestellungen mit einem Preis größer als 2500.00 aufweisen.
Sie können auch die Extraktions-UDFs des XML Extender zum Suchen nach Elementen und Attributen verwenden, wenn Sie keine Indizes oder Seitentabellen für die Anwendungstabelle erstellt haben. Die Verwendung der Extraktions-UDFs zum Durchsuchen der XML-Daten ist sehr aufwendig und sollte nur in Verbindung mit WHERE-Klauseln verwendet werden, die die Anzahl der bei der Suche berücksichtigten XML-Dokumente begrenzen.
Beispiel: Die folgende Anweisung sucht mit einer Extraktions-UDF des XML Extender:
SELECT sales_person from sales_tab WHERE extractVarchar(order, '/Order/Customer/Name') like '%IBM%' AND invoice_num > 100
In diesem Beispiel extrahiert die UDF die Elemente </Order/Customer/Name> mit dem Wert IBM.
Verwenden Sie beim Suchen nach Elementen oder Attributen mit mehrfachem Vorkommen die DISTINCT-Klausel, um doppelte Werte zu verhindern.
Beispiel: Die folgende Anweisung sucht mit einer DISTINCT-Klausel:
SELECT sales_person from sales_tab WHERE invoice_num in (SELECT DISTINCT invoice_num from part_side_tab WHERE price > 2500.00 )
In diesem Beispiel gibt die DAD-Datei an, daß /Order/Part/Price mehrfach vorkommt, und erstellt dafür eine Seitentabelle PART_SIDE_TAB. Die Tabelle PART_SIDE_TAB kann mehrere Zeilen mit derselben invoice_num enthalten. Durch die Verwendung von DISTINCT werden nur eindeutige Werte zurückgegeben.