
| XML Extensible Markup Language (XML). XML ist eine so genannte META-Sprache zur Beschreibung von Dokumenten. Ein Vorteil von XML ist der vereinfachte Austausch von Daten, da XML-Formate in einer strengen Grammatik definiert werden können und so die Implementierung von zuverlässigen Schnittstellen erlauben. |
| Xpath XPath stellt Funktionen und Ausdrücke zur Verfügung, um Knoten innerhalb von XML-Dokumenten zu lokalisieren. Mit XPath können auch Ausdrücke ausgewertet und Berechnungen durchgeführt werden. |
| XQuery XML Query Language. XQuery ist eine Sprache für die Abfrage von XML-Daten aus einer Datenbank. |
| W3C World Wide Web Consortium. Das W3C ist ein Gremium zur Standardisierung von Techniken für das Internet, wie z. B. HTML und XML. |
| SQL Structured Query Language. Sie dient als Kommunikationsinstrument mit der Datenbank. |
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
||||||||||||||||
|
Neben dem relationalen Datenmodell, bei dem die Daten in Tabellen gespeichert werden, ist mit der Version 9.1 ein XML-Datenmodell implementiert worden. Wichtigster Bestandteil dieses Modells ist der neue Datentyp XML, der es erlaubt, eine Tabellenspalte vom Typ XML zu definieren. Innerhalb einer solchen Spalte werden XML-Daten in einer "geparsten", hierarchischen Baumstruktur gespeichert. In der Datenbank können somit zwei verschiedene Arten von Datenmodellen gespeichert werden (siehe Abbildung 1).
Tabellen mit Spalten vom Datentyp XML können nicht in jeder DB2 Datenbank erstellt werden. Folgendes gilt es zu beachten:
Abbildung 2 zeigt ein Beispiel, wie eine Datenbank mit XML-Unterstützung angelegt werden kann.
Wichtigster Bestandteil einer XML-Tabelle ist der Datentyp XML. Dieser steht in seiner Verwendung genauso zur Verfügung wie die bereits bestehenden Datentypen.
Somit kann auch mit XML Support wie bisher die übliche DB2 SQL Syntax zum Erstellen oder Bearbeiten einer Tabelle verwendet werden. Für die Spalten, die XML-Daten aufnehmen sollen, muss nur der neue Datentyp genutzt werden.
Das Mischen von bestehenden Datentypen (integer, char, date, ...) mit dem neuen Datentyp XML innerhalb einer Tabelle ist ohne Probleme möglich. Eine Tabelle kann durchaus auch mehrere Spalten vom Datentyp XML enthalten.
Abbildung 3 zeigt ein Beispiel zum Erstellen einer einfachen XML-Tabelle mit zwei Spalten. Die erste Spalte ist vom Typ INTEGER und für eine laufende Nummer gedacht. Die zweite Spalte ist von Typ XML und dient der Speicherung von Mitarbeiterdaten.
XML-Daten können auf unterschiedliche Weise erfasst werden. Für einfache, kleine Dokumente kann das Insert-Statement verwendet werden. Abbildung 4 zeigt ein Beispiel, wie ein solches Statement aussehen könnte.
Bei großen und komplexen XML-Dokumenten ist diese Variante eher ungeeignet, da die XML-Struktur komplett ausgeschrieben werden muss. Je nach Größe der Struktur ist das mit sehr viel Schreibaufwand verbunden. Aus diesem Grund bietet es sich hier an, bestehende XML-Dokumente (.xml-Dateien) mit Hilfe des DB2-Import-Tools in die Tabelle zu laden. Abbildung 5 zeigt, wie diese bestehenden XML-Dokumente aussehen können.
Die übrigen Werte der Tabelle, die nicht vom Typ XML sind, müssen in Form einer ASCII-Datei vom Typ DELIMITER vorliegen. Eine Zeile in dieser Datei entspricht dann einem Datensatz für die Tabelle. Die Werte der einzelnen Tabellenspalten werden durch einen Delimiter (hier das Komma) voneinander getrennt.
An der Stelle, an der die Werte für die XML-Spalte erwartet werden, ist ein Verweis auf die zugehörige XML-Datei einzutragen. Dies geschieht mit Hilfe der XML Data Specification (XDS). Dabei ist nur die Angabe des Dateinamens erforderlich. Wo sich die XML-Datei im Pfad befindet, wird dann erst beim IMPORT-Befehl angegeben (siehe Abbildung 6). Den IMPORT-Befehl zum Laden der Daten zeigt die Abbildung 7.
Nachdem der erste Teil dieses Artikels aufzeigt, wie XML-Daten in die Datenbank gelangen, erläutert der folgende Abschnitt, wie XML-Daten abgefragt werden.
Grundsätzlich gibt es zwei Möglichkeiten für die Abfrage:
Bei XQUERY handelt es sich um eine Abfragesprache für XML-Daten, die vom W3C Konsortium entwickelt wurde und innerhalb von DB2 verwendet werden kann.
SQL ist die Abfragesprache für relationale Datenbanken. Innerhalb von DB2 werden nun für SQL zusätzliche Funktionen zur Verfügung gestellt, die es ermöglichen, XML-Daten abzufragen. Diese Funktionen können dann in SQL verwendet werden. Man spricht hier auch von SQLX.
Für beide Sprachen bildet die Funktionsbibliothek XPATH einen wesentlichen Bestandteil. Mit ihrer Hilfe lassen sich bestimmte Teile (Elemente und Attribute) innerhalb von XML-Dokumenten lokalisieren. Die Tabelle in Abbildung 8 zeigt anhand unserer zuvor geladenen Daten einige Beispiele für einen XPATH auf.
XQuery kann entweder direkt aufgerufen oder innerhalb von SQL-Abfragen eingebettet werden. Die Abfragesprache bietet eine sehr große Flexibilität, um auf die ebenfalls flexible XML-Struktur zu reagieren. Dies ist von Vorteil, wenn nicht bekannt ist, in welchem Element, also an welcher Stelle des XML-Baumes, sich die gesuchten Daten befinden.
XQUERY <Funktion> (Tabelle.Spalte oder Select-Anweisung) [XPATH]
Es stehen zwei Funktionen zur Verfügung, mit deren Hilfe XML-Daten aus dem Hierarchiebaum
extrahiert werden können. Die Funktionen erwarten entweder die Angabe der Tabelle und
XML-Spalte oder aber eine SQL-Anweisung, die XML-Dokumente selektiert.
db2-fn:xmlcolumn()
Die Funktion xmlcolumn() erwartet als Argument die Tabelle und die XML-Spalte
der Tabelle, aus der Daten selektiert werden sollen. Ohne die weitere Angabe eines XPATH ruft diese
Funktion die vollständige XML-Spalte ab. Alle XML-Dokumente der Spalte werden ermittelt. Abbildung
9 zeigt ein einfaches Beispiel einer Abfrage mit der Funktion db2-fn:xmlcolumn().
Selektiert werden alle Daten der XML-Spalte DATEN aus der Tabelle MITARBEITER.
db2-fn:sqlquery()
Die Funktion sqlquery() ruft die Werte einer so genannten SQL-Fullselect-Operation
ab. Als Argument erwartet sie eine Select-Anweisung, die die XML-Spalte, aus der Daten ermittelt werden sollen,
selektiert. Hierbei muss nicht auf die Groß- und Kleinschreibung geachtet werden, da es sich um "normales"
SQL handelt. Ein einfaches Beispiel einer Abfrage mit der Funktion db2-fn:sqlquery zeigt
Abbildung 10. Auch hier werden wiederum alle Daten der XML-Spalte DATEN aus der Tabelle MITARBEITER selektiert.
Durch einen XPATH kann das Abfrageergebnis eingeschränkt werden und die Aufstellung einer weiteren Suchbedingung ist nicht mehr notwendig (siehe Abbildung 11).
Eine reine SQL-Abfrage liefert aus einer XML-Spalte immer das komplette XML-Dokument zurück und ist alleine nicht in der Lage, nur bestimmte Teile dieses Dokumentes zu selektieren. Dazu müssen zusätzliche Funktionen eingesetzt werden. Mögliche Funktionen für die Abfrage sind:
Eine Kombination bei der Abfrage mit relationalen Daten ist möglich. Abbildung 12 gibt ein Beispiel, das die Funktion XMLQUERY verwendet.
XMLEXISTS ist eine Funktion, mit der Vergleiche durchgeführt werden. Sie bestimmt, ob ein XQuery-Ausdruck überhaupt ein Element zurückgibt. Verwendet wird diese Funktion in Zusammenarbeit mit der where-Klausel, um Zeilen einer Abfrage aus der Ergebnismenge auszusortieren (siehe Abbildung 13).
FLWOR ist ein wichtiger Bestandteil von XQUERY und ähnelt sehr stark einem SQL Select Statement (Select ... from ... where ... order by ...). Abbildung 14 zeigt ein Beispiel für eine FLWOR-Abfrage.
Die FLWOR-Methode wird häufig verwendet, um XML-Dokumente bei einer Abfrage miteinander zu verbinden (JOIN), XML-Daten zu restrukturieren oder XML-Abfrageergebnisse zu sortieren.
FLWOR ist die Abkürzung für folgende Ausdrücke:
Innerhalb einer for-Schleife werden Elementknoten eines XML-Dokumentes durchlaufen. Während dieses Laufes können Variablen deklariert und Werte aus dem XML-Dokument zugewiesen werden. Mehrere Variablen werden durch Kommas voneinander getrennt.
Durch eine Bedingung besteht die Möglichkeit, das Ergebnis, welches durch die for/let-Klausel selektiert wurde, zu filtern und einzugrenzen.
Um das Ergebnis zu ordnen bzw. um festzulegen, in welcher Reihenfolge die Return-Werte angezeigt werden, wird mittels der Klausel order by angegeben, ob auf- oder absteigend sortiert wird.
Die return-Klausel gibt letztendlich an, was zurückgegeben werden soll. Hierbei können sowohl zuvor deklarierte Variablen als auch Elementknoten gewählt werden.
Zusätzlich besteht die Möglichkeit, neue Elemente und Texte mit in die Ausgabe zu packen. Für jede Bedingung in der for-Klausel gibt es einen Return-Wert.
Mit dem Datentyp XML ist eine sehr mächtige Funktion in die DB2 Version 9.1 eingeführt worden, die mit Sicherheit viele neue Möglichkeiten im Zusammenhang mit der Speicherung von XML-Daten in Datenbanken bietet. Dieser Artikel zeigt anhand kleiner Beispiele das Prinzip dieser Technik. Mit dem vollen Funktionsumfang könnten durchaus ganze Bücher gefüllt werden.
Inwieweit XML in der Praxis Verwendung finden wird, bleibt abzuwarten. Die Tatsache, dass die Struktur komplexer und weitaus verzweigter ist, als die von Relationen, schreckt mit Sicherheit noch so manchen Interessenten ab, ebenso wie die neue Abfragemethodik.
Mit diesem Artikel endet nun auch unsere Reihe zum Thema "IBM DB2 UDB 9.1 Viper". Bei Fragen sprechen Sie uns an!
Thorsten Schuhmacher (info@ordix.de).