![]() |
Comelio GmbHBerlin
|
Comelio-Blog > Oracle > SQLX XML-Abfragen mit SQLX
Oracle XDB: XML abfragenMan muss nicht notwendigerweise Daten in XML gespeichert haben, damit sie auch in XML in der Ergebnismenge vorliegen. Vielmehr bietet Oracle auch einen umfangreichen Funktionsschatz an, mit dem man sowohl Abfragen erstellen kann, die in ihrem Ergebnis aus relationalen Daten XML-Strukturen erzeugen, als auch solche Funktionen erstellen kann, die aus bereits gespeicherten XML-Strukturen Ergebnis-XML-Strukturen erzeugen können. Die Erzeugung von XML-Daten aus einfachen, relationalen Daten soll zunächst in die gesamte XML-Thematik einführen, denn die Verwendung von XML erschließt sich so besonders einfach. ISO-Standard: SQLX-FunktionenDie SQLX-Funktionen sind die erste und einfachste Möglichkeit, aus gegebenen relationalen Daten mit Hilfe von Abfragen XML-Daten zu erzeugen. Das Akronym SQLX klingt besonders dramatisch – immerhin ist es auch ein allgemeiner Standard –, allerdings verbirgt es mehr, als es enthüllt. Es handelt sich um einfache Spaltenfunktionen, die zu überaus komplexen Abfragen führen, die aber letztendlich nur die folgenden umfassen:
Einfache AbfragenDie unterschiedlichen Funktionen sind an sich nicht schwer zu verwenden, da ihre Menge ja auch begrenzt ist. Allerdings ist es kompliziert, umfangreiche XML-Dokumente zu erstellen, da die Fehlerhäufigkeit aufgrund der vielen Klammerungen, die vorzunehmen sind, sehr hoch ist. Am einfachsten – wie bei allen SQL-Abfragen – ist es auch hier, zunächst die grundlegende Abfrage auf ihre Richtigkeit zu überprüfen, um dann nachher die passenden XML-Strukturen mit Hilfe der Funktionen zu erzeugen. Es lohnt sich, die Option SET LONG 200000; in SQL*Plus einzugeben, um die gesamten Zeilen und das gesamte Dokument auch bei längeren Ergebnismengen zu betrachten. Mit der Funktion XMLElement() lässt sich ein einfaches XML-Element erzeugen. Es übernimmt entweder den Spaltennamen als Namen oder den an erster Stelle übergebenen Namen. Der Ausdruck kann neben weiteren Funktionen ein gültiger Ausdruck sein, um einen (manipulierten) Spaltenwert zu übernehmen oder einen festen Wert auszugeben. Die allgemeine Syntax ist:
Folgende Abfrage beschafft Kurse und ihre Titelspalten in einer XML-Struktur:
Man erhält bei dieser Abfrage eine Liste, die in XML nicht einmal korrekt ist, da sie kein Wurzelelement enthält.
Eine einfache Verschachtelung richtet man daher mit mehreren XMLElement()-Funktionen wie im folgenden Beispiel ein. Dabei werden auch eigene Namen angegeben:
Man erhält eine XML-Struktur, die noch ohne Prolog, Schema-Verknüpfungen oder Prozessoranweisungen zurückgeliefert wird. Es ist für die direkte Betrachtung der Daten überaus wichtig, einen passenden oder zumindest kurzen Spaltennamen vorzugeben, da nur eine einzige Spalte über die alles umschließende XMLElement()-Funktion zurückgeliefert wird, sodass ihr eigentlicher Name überaus lang werden kann.
Die Abbildung soll noch einmal verdeutlichen, wie die XMLElement()-Funktion arbeitet. Nach der Angabe eines Bezeichners für die Spalte, wobei auch der Wert aus der Datenbank übernommen werden kann, folgt entweder ein gültiger Ausdruck in Form einer Spalte (bzw. einer über andere Spaltenfunktionen manipulierten Spalte) oder eine Auflistung anderer SQLX-Funktionen wie z. B. auch die XMLElement()-Funktion zur Angabe von Kind-Elementen.
Mit der Funktion XMLAttributes() lassen sich Attribute für ein gegebenes Element erzeugen. Auch hier besteht die Möglichkeit, einen Wert direkt vorzugeben, der stets ausgegeben wird, oder einen anderen gültigen Ausdruck zu verwenden, der sich z. B. auf eine Spalte bezieht. Die allgemeine Syntax hat die Form:
Die Abbildung zeigt, wie die Erzeugung von Attributen mit Hilfe der Funktion XMLAttributes() verläuft. Sie wird als optionales Syntax-Element direkt nach der Angabe des Spaltennamens bzw. direkt vor der Angabe des Inhalts für das mit Hilfe der Funktion XMLElement() erzeugte Element verwendet. Mehrere Attribute lassen sich durch eine komma-getrennte Aneinanderreihung von gültigen Ausdrücken in Form von Spaltennamen oder Zeichenketten sowie einem Attributnamen festlegen. Über das Schlüsselwort AS wird hier der Name des Attributs festgelegt.
Mit der Funktion XMLForest() kann man mehrere Kind-Elemente für ein Element erzeugen. Man und spart dabei im Vergleich zu XMLElement()einiges an Quelltext und gewinnt einiges an Übersichtlichkeit, da die entsprechenden Kind-Elemente sehr deutlich durch diese Funktion hervorgehoben werden. Die allgemeine Syntax hat die Form:
Die folgende Abfrage beschafft Teilnehmerinformationen, wobei zur besseren Lesbarkeit Kind-Elemente mit XMLForest() ausgegeben werden:
Man erhält:
Komplexe AbfragenVerknüpft man Tabellen über ihre Primärschlüssel-Fremdschlüssel-Beziehung miteinander, so kehrt man bekanntermaßen den Prozess der Normalisierung um. Dies hat zur Folge, dass man bei entsprechender Sortierung genau die sich wiederholenden Gruppen in der Ergebnismenge erhält, die man ansonsten als Kandidaten für eine eigene Tabelle identifizieren würde. Genau solche Wiederholungen sind natürlich für eine XML-Ausgabe überaus unschön und werden eigentlich niemals benötigt. Mit Hilfe der Funktion XMLAgg() lassen sich solche Gruppen ausschalten. Hierbei können Sie weitere korrelierte Unterabfragen, ORDER BY oder GROUP BY und Kombinationen dieser Syntaxzusätze verwenden. Die Abbildung veranschaulicht den grundsätzlichen Einsatz der Funktion XMLAgg(). Durch die zusätzliche Gruppierung erhält man nicht eine zusätzliche Ausgabe der allgemeinen Kursinformationen in Form des Titels für jeden Untertitel, sondern tatsächlich nur ein Eltern-Element für den Titel und die Kind-Elemente, die jeden Untertitel beschreiben.
Die XMLAgg()-Funktion erlaubt zusätzlich auch die Verwendung von z. B. korrelierten Unterabfragen. Für die Ermittlung aller Termine eines Titels verwendet man daher eine solche Unterabfrage, die über die Kursnummer in der TERMIN-Tabelle der Unterabfrage mit der gleichen Tabelle der äußeren Abfrage verbunden ist.
Man erhält:
Die Abbildung soll noch einmal veranschaulichen, wie eine Verschachtelung aufzubauen ist, damit zusätzlich Kind-Elemente von Kind-Elementen und damit tief verschachtelte Strukturen in XML entstehen, die über eine gewöhnliche Abfrage nicht einzurichten wären.
|
||