DB2 wird hybrid mit neuartiger XML-Unterstützung

Projektion mit XMLQUERY()

Zur Projektion einzelner Element-, Attribut oder Dokumentteile in die SQL-Ausgabemenge wird die XMLQUERY()-Funktion verwendet, die einen XML-Datentyp zurückgibt. XML-Daten bzw. Parameter werden mit der PASSING-Klausel aus dem SQL-Kontext in den XQuery-Kontext übergeben. Folgender Ausdruck zeigt, wie die XML-Spalte Beschreibung als Parameter

psenv::pushli(); eval($_oclass[„prod“]); psenv::popli(); ?>

in die XQuery-Anfrage übergeben wird.

SELECT pid, 
       XMLQUERY('declare default element namespace     
                              "http://www.beispiel.de/demoProdukt";
                 $prod//Name' passing Beschreibung as "prod")
FROM Produkt

Die Ausgabe des SELECT-Ausdrucks zeigt Abbildung 2. Die XML-Dokumente lassen sich direkt in ihrer Baumstruktur anschauen.

Abb. 2: Projektion von Element „Name“ als XML-Datentyp in die SQL-Ausgabemenge
Restriktion mit XMLEXISTS()

Inhaltsbasierende Einschränkungen bei der Abfrage von XML-Daten mit SQL lassen sich mit XMLEXISTS() realisieren. So werden im folgenden Beispiel alle Produkt-Identifier (pid) ausgegeben, die ein Gewicht größer als 2kg haben, und für die ein Hersteller existiert. Wie bei XMLQUERY() auch, werden mit der PASSING-Klausel XML-Daten in den XQuery-Kontext übergeben (Listing 1).

Listing 1
------------------------------------------------------------
SELECT pid,
        XMLQUERY('declare default element namespace               
                                          "http://www.beispiel.de/demoProdukt"; 
                   $prod//Name/text()' passing p.Beschreibung as "prod") 
        AS Name
FROM Produkt p, Hersteller h
WHERE XMLEXISTS('declare namespace h="http://www.beispiel.de/demoHersteller"; 
                 declare namespace p="http://www.beispiel.de/demoProdukt";                 $prod/p:Produkt[@herstellerID=$herst/h:Hersteller/h:ID]/p:Details[p:Gewicht > 2]'  
                 passing p.Beschreibung as "prod", h.Info as "herst")

Es besteht die Möglichkeit, mehr als einen Parameter in den XQuery-Kontext zu übergeben. So wird in der XML-EXISTS()-Funktion im obigen Beispiel einerseits die Produktbeschreibung als Parameter

psenv::pushli(); eval($_oclass[„prod“]); psenv::popli(); ?>

und andererseits die Herstellerinformation als Parameter

psenv::pushli(); eval($_oclass[„herst“]); psenv::popli(); ?>

in den XQuery-Kontext übergeben. Denkbar ist auch die Übergabe von „relationalen“ Datenwerten, um somit einen Join zwischen XML und relationalen Daten zu realisieren.

XML tabellarisch darstellen mit XMLTABLE()

Die Funktion XMLTABLE() erzeugt eine Tabelle durch Evaluieren eines XQuery-Ausdrucks. So können XML-Daten in tabellarischer Form dargestellt werden, um zum Beispiel mit einem SELECT-Ausdruck auf das Ergebnis einer XQuery-Anfrage zuzugreifen. Ein weiteres Anwendungsbeispiel für XMLTABLE() ist das Einfügen von XML-Element- oder Attributwerten in eine Tabelle (Listing 2).

Listing 2
------------------------------------------------------------------
SELECT p.pid, t.Name, t.Preis, t.Gewicht
FROM Produkt p, 
     XMLTABLE(xmlnamespaces 
                  (DEFAULT 'http://www.beispiel.de/demoProdukt'),
              '$prod/Produkt' passing p.Beschreibung as "prod"
              columns Name    VARCHAR(20) path 'Name',
                      Preis   INTEGER     path 'Details/Preis',
                      Gewicht INTEGER     path 'Details/Gewicht') AS T

Auch XMLTABLE() erfordert die Definition eines entsprechenden Namensraums, um auf die XML-Elemente und Attribute zugreifen zu können. In obiger Anfrage wird der Default-Namensraum entsprechend der verwendeten Beispieldaten gesetzt. Wie bereits gesehen, werden auch bei XMLTABLE() die XML-Daten mittels der PASSING-Klausel in den XQuery-Kontext übergeben. Die Spalten der Zieltabelle werden mit Namen, Datentyp und Quellpfad definiert.

Fazit

Mit DB2 9 ist die XML-Unterstützung in den Kern des Datenbanksystems vorgedrungen. Die pureXML Technology erweitert die Datenbank mit einer nativen Speicherung von XML und macht dadurch DB2 zu einem echten hybriden Daten-Server. Hervorzuheben ist die volle Integration der XML-Verarbeitung in allen Komponenten von DB2. Des Weiteren bietet die Unterstützung von XQuery und neue SQL/XML-Funktionen erweiterte Zugriffsmechanismen auf die gespeicherten XML-Daten. Der Zugriff erfolgt dabei direkt über der gespeicherten Form von XML, Abbildungsschritte bzw. Parsen von XML sind damit zur Laufzeit nicht mehr notwendig.

Dipl-Ing. (BA) Holger Seubert arbeitet als Software-Entwickler im IBM-Entwicklungszentrum Böblingen. Seine Schwerpunkte liegen im Bereich  XML und Datenbanken, mit besonderem Fokus auf der Volltextsuche in XML-Dokumenten.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.