XQuery und XML-Datenbanken
Mit Hilfe eines XQuery-Dokuments können Sie eine Abfrage an einer XML-Datenbank (XML DB) durchführen. Derzeit wird diese XQuery-Funktionalität nur für IBM DB2-Datenbanken unterstützt. Der Vorgang beim Abfragen einer XML-DB mit Hilfe von XQuery läuft folgendermaßen ab: (i) der XQuery-Prozessor wird so eingestellt, dass XML in einer Datenbank - und nicht XML in einem XML-Dokument - abgefragt wird; und (ii) die XML-Daten in der DB werden aufgerufen.
Dabei müssen die folgenden Schritte durchgeführt werden:
1.Definieren Sie das XQuery-Dokument für die Abfrage der XML-DB, indem Sie am Beginn des Dokuments das Schlüsselwort XQUERY einsetzen.
2.Aktivieren Sie (über das Fenster "Info") für das aktive XQuery-Dokument die DB-Unterstützung und stellen Sie (im Dialogfeld "Verbindungsassistent") eine Verbindung zur DB her.
3.Fügen Sie im XQuery-Dokument DB-spezifische XQuery-Erweiterungen ein, um die DB-Daten aufrufen zu können und für XQuery-Operationen verfügbar zu machen.
4.Führen Sie das XQuery-Dokument in XMLSpy aus.
Einrichten des XQuery-Dokuments für die Abfrage der XML DB
Um das XQuery-Dokument für eine Abfrage einer XML DB zu konfigurieren, öffnen Sie das XQuery-Dokument (oder erstellen Sie ein neues XQuery-Dokument) und geben Sie das Schlüsselwort XQUERY (Groß- und Kleinschreibung irrelevant) am Beginn des Dokuments (vor dem Prolog) ein; siehe Beispiel unten.
XQUERY (: Retrieve details of all customers :)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<a> {db2-fn:xmlcolumn("CUSTOMER.INFO")} </a>
Wenn im Dokument der optionale Ausdruck xquery version verwendet wird, wird dennoch das Schlüsselwort XQUERY benötigt.
XQUERY xquery version "1.0"; (: Retrieve details of all customers :)
declare default element namespace "http://https://www.altova.com/xquery/databases/db2";
<a> {db2-fn:xmlcolumn("CUSTOMER.INFO")} </a>
Anmerkung: | Die integrierten XMLSpy XQuery-Prozessoren lesen das Schlüsselwort XQUERY als Indikator dafür, dass eine XML DB aufgerufen werden soll. Folglich führt der Versuch, ein XQuery-Dokument, das das Schlüsselwort XQUERY enthält, an einem XML-Dokument auszuführen, das nicht in einer XML DB enthalten ist, zu einem Fehler. |
Aktivieren der DB-Unterstützung für XQuery und Herstellen einer Verbindung zur DB
Die DB-Unterstützung für ein XQuery-Dokument wird durch Aktivierung des Kontrollkästchens "Datenbankunterstützung aktivieren" im Fenster "Info" (Abbildung unten) aktiviert. Beachten Sie: Die Unterstützung von DB muss für jedes XQuery-Dokument separat aktiviert werden. Jedes Mal muss ein XQuery-Dokument neu geöffnet werden.
Wenn Sie die DB-Unterstützung im Fenster "Info" aktivieren, erscheint ein Verbindungsassistent, mit Hilfe dessen Sie eine Verbindung zu einer Datenbank herstellen können. Derzeit werden nur IBM DB2-Datenbanken unterstützt. Die Herstellung einer Verbindung zu einer DB ist im Abschnitt Herstellen einer Verbindung zu einer Datenbank beschrieben. Wenn bereits Verbindungen zu Datenquellen bestehen, werden diese im Fenster "Info" in der Auswahlliste "Datenquellen" aufgelistet (Abbildung unten) und Sie können eine dieser Datenquellen als Datenquelle für das aktive XQuery-Dokument auswählen. Im Fenster "Info" können Sie auch das Root-Objekt aus den verfügbaren Root-Objekten in der Auswahlliste auswählen.
Der Verbindungsassistent (mit Hilfe dessen Sie eine Verbindung zu einer DB herstellen können), kann jederzeit durch Klicken auf die Schaltfläche im Fenster "Info" aufgerufen werden.
Anmerkung: | Beim Schließen eines XQuery-Dokuments geht auch die Verbindung zur Datenbank verloren. Wenn Sie das XQuery-Dokument später wieder öffnen, müssen Sie auch die DB-Verbindung wieder herstellen. |
IBM DB2-spezifische Erweiterungen für XQuery
Zum Abrufen von Daten aus einer IBM DB2-Datenbank können in XQuery-Dokumenten zwei IBM DB2-spezifische Funktionen verwendet werden:
•db2-fn:xmlcolumn ruft eine gesamte XML-Spalte ab, ohne Sie zu durchsuchen oder zu filtern.
•db2-fn:sqlquery ruft Werte auf Basis einer SQL SELECT-Anweisung ab
Sie können anschließend mit den XML-Daten, die mit Hilfe dieser Funktionen abgerufenen wurden, mit XQuery-Standardkonstrukten arbeiten. Siehe Beispiele unten.
db2-fn:xmlcolumn:Das Argument der Funktion ist ein String-Literal, bei dem die Groß- und Kleinschreibung beachtet werden muss, das eine XML-Spalte in einer Tabelle ermittelt. Das String-Literal-Argument muss ein qualifizierter Spaltenname von Typ XML sein. Die Funktion gibt alle XML-Daten in der Spalte als Sequenz zurück, ohne daran eine Suchbedingung anzuwenden. Im folgenden Beispiel werden alle Daten der (XML)-Spalte INFO der Tabelle CUSTOMER innerhalb eines <newdocelement> Elements der obersten Ebene zurückgegeben:
XQUERY (: Retrieve details of all customers :)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<newdocelement> {db2-fn:xmlcolumn("CUSTOMER.INFO")} </newdocelement>
Die abgerufenen Daten können anschließend mit XQuery-Konstrukten abgefragt werden. Im Beispiel unten werden die XML-Daten, die aus der XML-Spalte INFO der Tabelle CUSTOMER abgerufen wurden, mit Hilfe eines XQuery-Konstrukts gefiltert, sodass nur die Profile der Kunden aus Toronto abgerufen werden.
XQUERY (: Retrieve details of Toronto customers :)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<newdocelement> {db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo[addr/city='Toronto']} </newdocelement>
Anmerkung: | Im Beispiel oben ist das Dokument-Element der XML-Dateien in den einzelnen Zellen das Element customerinfo, und als Root-Node der XML-Sequenz, die von db2-fn:xmlcolumn zurückgegeben wird, wird ein abstrakter Node oberhalb der customerinfo Nodes angenommen. |
db2-fn:sqlquery:Die Funktion verwendet eine SQL Select-Anweisung als Argument und gibt eine Sequenz von XML-Werten zurück. Die abgerufene Sequenz wird anschließend mit XQuery-Konstrukten abgefragt. Im folgenden Beispiel wird die Spalte INFO in der Tabelle CUSTOMER nach Datensätzen durchsucht, deren CID-Feld einen Wert zwischen 1000 und 1004 hat.
XQUERY (: Retrieve details of customers by Cid:)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<persons>
{db2-fn:sqlquery("SELECT info FROM customer WHERE CID>1000 AND CID<1004")/
<person>
<id>{data(@Cid)}</id>
<name>{data(name)}</name>
</person>}
</persons>
Die oben angeführte XQuery gibt die folgende Ausgabe zurück:
<persons xmlns="https://www.altova.com/xquery/databases/db2">
<person>
<id>1001</id>
<name>Kathy Smith</name>
</person>
<person>
<id>1002</id>
<name>Jim Jones</name>
</person>
<person>
<id>1003</id>
<name>Robert Shoemaker</name>
</person>
</persons>
Beachten Sie die folgenden Punkte:
•Die Standard-Element-Namespace-Deklaration im Prolog gilt für das gesamte XQuery-Dokument und dient sowohl zur Navigation im XML-Dokument als auch zur Erstellung neuer Elemente. D.h. der XQuery-Selektor name wird zu <default-element-namespace>:name erweitert und Elemente, die erstellt werden, wie z.B. persons, befinden sich im Standard-Element-Namespace.
•Bei der SQL Select-Anweisung wird die Groß- und Kleinschreibung nicht beachtet.
•Die WHERE-Klausel der Select-Anweisung sollte ein weiteres Datenbankelement referenzieren - keinen Node innerhalb der aufgerufenen XML-Datei.
•Der Schrägstrich "/" hinter der Funktion db2-fn:sqlquery steht für das erste Datenelement der zurückgegebenen Sequenz und dieses Datenelement ist der Kontext-Node für die weitere Navigation.
Ausführen des XQuery-Dokuments
Um das XQuery-Dokument auszuführen, wählen Sie den Befehl XQuery-Ausführung (Menü XSL/XQuery). Alternativ dazu können Sie auch Alt+F10 drücken oder auf die Schaltfläche "XQuery-Ausführung" klicken. Das Ergebnis der Ausführung wird in einem neuen Dokument angezeigt.