Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  2/2008  Pfeil  Datenbanken
suche: 
Dieser Artikel richtet sich an Administratoren, die sich mit den neuen Funktionen der DB2 Datenbank, Version 9.1, vertraut machen wollen.

Glossar

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.


IBM DB2 UDB 9.1 "Viper" (Teil VI):

Erste Schritte mit XML in DB2


Wie schnell doch in der IT die Zeit vergeht! - Unsere Artikelreihe zu den New Features in DB2 Version 9.1 ist noch nicht ganz beendet, da gibt es bereits eine neue Version. Sie ist seit Ende 2007 erhältlich und lässt auch schon einen Einblick in die Neuerungen zu. Doch bevor wir uns der Version 9.5 widmen, schauen wir uns den neuen Datentyp XML aus der Version 9.1 an.

ARD Verzeichnisstruktur
Abb. 1: Ab der Version 9.1 unterstützt DB2 neben dem relationalen Datenmodell auch das XML-Datenmodell.
$ db2 "CREATE DATABASE XMLDB USING CODESET UTF-8 TERRITORY DE;"
Abb. 2: Anlegen der Datenbank XMLDB mit dem Zeichensatz UTF-8.
$ db2 "CREATE TABLE MITARBEITER (LFD_NR INT, DATEN XML);"
Abb. 3: Befehl zum Anlegen einer XML-Tabelle.
$ db2 "insert into mitarbeiter (lfd_nr, daten) values
( 1,'<mitarbeiter nr="880">
  <name>Muster</name>
  <vorname>Max</vorname>
  <anschrift>
    <strasse hnr="13">Musterstrasse</strasse>
    <ort plz="12345">Musterhausen</ort>
  </anschrift>
  </mitarbeiter>'
),
( 2, '<mitarbeiter nr="4711">
  <name>Beispiel</name>
  <vorname>Peter</vorname>
  <anschrift>
    <strasse hnr="101">Beispielstrasse</strasse>
    <ort plz="67890">Beispielstadt</ort>
  </anschrift>
  </mitarbeiter>'
);"
Abb. 4: Insert-Statement zur Erfassung von XML-Daten.
$ cat /home/inst1/xml_files/muster.xml
<?xml version="1.0" encoding="UTF-8"?>
<mitarbeiter nr="880">
  <name>Muster</name>
  <vorname>Max</vorname>
  <anschrift>
    <strasse hnr="13">Musterstr</strasse> 
    <ort plz="12345">Musterhausen</ort>
  </anschrift>
  </mitarbeiter>
  
$ cat /home/inst1/xml_files/beispiel.xml
<?xml version="1.0" encoding="UTF-8"?>
<mitarbeiter nr="4711">
  <name>Beispiel</name>
  <vorname>Peter</vorname>
  <anschrift>
    <strasse hnr="101">Beispielstrasse</strasse>
    <ort plz="67890">Beispielstadt</ort>
  </anschrift>
  </mitarbeiter>
Abb. 5: Aufbau der beiden XML-Dokumente.
$ cat /home/inst1/mitarbeiter.del
1,<XDS FIL='muster.xml'/>
2,<XDS FIL='beispiel.xml'/>
Abb. 6: Aufbau der ASCII-Datei /home/inst1/mitarbeiter.del.
$ db2 "IMPORT FROM /home/inst1/mitarbeiter.del of DEL XML FROM /home/inst1/xml_files/ INSERT INTO mitarbeiter"
Abb. 7: IMPORT-Befehl zum Laden der Daten für beide XML-Dateien aus Abb. 5.

XPATH

Ergebnis

/mitarbeiter/string(@nr)

880

4711

/mitarbeiter/name

<name>Muster</name>

<name>Beispiel</name>

/mitarbeiter/name/text()

Muster

Beispiel

/mitarbeiter/anschrift/ort/text()

Musterhausen

Beispielstadt

/mitarbeiter[@nr="880"]/name

<name>Muster</name>

/mitarbeiter[2]/name/text()

Muster

Abb. 8: Beispiele für einen XPATH.
$ db2 "XQUERY db2-fn:xmlcolumn('MITARBEITER.DATEN');"
Abb. 9: Abfrage der mittels der Funktion db2-fn:xmlcolumn().
$ db2 "XQUERY db2-fn:sqlquery('select daten from mitarbeiter');"
Abb. 10: Abfrage mittels der Funktion db2-fn:sqlquery().
$ db2 "XQUERY db2-fn:xmlcolumn('MITARBEITER.DATEN')/mitarbeiter/name/text();"
Abb. 11: XPATH zur Einschränkung des Abfrageergebnisses.
select lfd_nr, 
XMLQUERY ('$i/mitarbeiter/name/text()' passing daten as "i") 
AS NAME from mitarbeiter;

LFD_NR NAME ----------- 1 Muster 2 Beispiel
Abb. 12: Eine SQL-Abfrage verwendet die Funktion XMLQUERY, um XML-Daten zu selektieren.

$ db2 "select lfd_nr, XMLQUERY ('$i/mitarbeiter/anschrift' passing daten as "i") AS ANSCHRIFT from mitarbeiter where XMLEXISTS ('$i/mitarbeiter/anschrift[ort="12345 Musterhausen"]' passing daten as "i");"



LFD_NR ANSCHRIFT ---------------- 1 <anschrift><strasse hnr="13">Musterstr</strasse> <ort plz="12345">Musterhausen</ort></anschrift>
Abb. 13: Einschränkung des Abfrageergebnisses mit Hilfe der Funktion XMLEXISTS.
xquery
for $i in db2-fn:xmlcolumn ('MITARBEITER.DATEN')/mitarbeiter
let $ma := $i/name
where $i/name/text() = "Beispiel"
return <ma>
	{$ma}
		</ma>;
AUSGABE:
--------
<ma>
	<name>Beispiel</name>
</ma>
Abb. 14: Abfrage von Daten mittels FLWOR-Ausdruck.

Architektur

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).

XML-Datenbank

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.

XML-Tabellen

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 erfassen

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.

XML-Daten abfragen

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

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.

Die Syntax:

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.

Die Funktionen:

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).

SQLX

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

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.

Fazit

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).