![]() |
Comelio GmbH
|
Comelio-Blog > Oracle > SysXMLGen XML-Abfragen mit SysXMLGen
Oracle XDB: Oracle-spezifische SQL-Funktionen für XMLNeben den SQLX-Funktionen, die überaus schwergängig zu bedienen scheinen, wenn man andere Techniken kennt, besitzt Oracle weitere Funktionen, die allerdings spezifisch für dieses Datenbanksystem sind. Mit ihnen lassen sich ebenfalls Ergebnisse in XMLType-Form erzeugen. Die Aggregation lässt sich dann über Objekt- und Tabellentypen realisieren. Dies erleichtert die Lesbarkeit der Abfrage im Gegensatz zu den SQLX-Funktionen, erfordert allerdings mehr Planung auf der Datenbankseite, weil natürlich die entsprechenden Typen vorhanden sein müssen. Im Gegensatz zu DBMS_XMLQUERY und DBMS_XMLGEN lassen sich diese Funktionen direkt aus SQL heraus aufrufen. Erzeugung von einfachen ElementenIn einer ersten Variante erzeugt man mit SYS_XMLGEN() für jeden Ausdruck ein Element mit dem Inhalt des Ausdrucks. Dies kann ein Spaltenwert oder auch eine vorgegebene Zeichenkette sein, die zusätzlich auch mit Funktionen kombiniert werden können:
Man erhält eine Liste mit den ausgewählten Kursen, wobei jede Reihe eine XML-Struktur beinhaltet. Sie besteht aus den Spaltennamen als Elementnamen und den Spaltenwerten als Textknoten. Bei einer möglichen Verarbeitung solcher Strukturen ist darauf zu achten, dass man stets einen Cursor verwendet, da mehrere Reihe zurückgeliefert werden und nicht nur ein einziges XML-Dokument.
Einsatz von Objekt- und TabellentypenNeben der gerade gezeigten sehr einfachen Verwendung von SYS_XMLGEN() lässt sich als Ausdruck auch ein Objekttyp benutzen, der jeweils in der Datenbank gespeichert sein muss. Dies erhöht zwar die Lesbarkeit der SQL-Abfrage im Vergleich zu den SQLX-Funktionen, jedoch ist man bei dieser Technik der Verschachtelung ebenso wie beim DBMS_XMLGEN-Paket verpflichtet, zunächst die entsprechenden Typen bereitzustellen. Dies ist für eine umfangreiche Anwendungsentwicklung mit wiederholter Ausführung sicherlich kein Problem, doch für eine spontane und einmalige SQL-Abfrage ein recht großer Aufwand. Der erste Objekttyp enthält Attribute, die aus Spalten der Kurstabelle bestehen und die Kursnummer, den Titel und den Untertitel beschreiben. Für eine Struktur mit mehreren Reihen und nicht nur mit mehreren Spalten erzeugt man hieraus einen Tabellentyp. Diesen ruft man schließlich in einem dritten Objekttyp für eine Dozentenliste auf.
Die Abbildung veranschaulicht noch einmal die unterschiedlichen Datenstrukturen, die für eine verschachtelte Abfrage bereitstehen müssen.
Die Abfrage besteht grundsätzlich aus einer wenig veränderten, einfachen SQL-Abfrage, wobei die Spalten vom Typnamen als Konstruktor umgehen sind und die gesamte Spalte der Parameter der SYS_XMLGEN()-Funktion ist. Diese Abfrage erzeugt eine Übertragung oder eine Abbildung der Spalten auf die Objekttypattribute.
Das Ergebnis ist eine einfache XML-Struktur als XMLType, die aus zwei Spalten und einem Attribut besteht. Das Attribut wird automatisch dem ROW-Element hinzugefügt, das die einzelnen Reihen beschreibt.
Für eine tiefere Verschachtelung lassen sich alle drei Typen verwenden, wobei für die Abbildung der Dozentenspalten auf die Attribute des Dozent_T-Typs dieser Typ als Konstruktor aufgerufen wird und wobei für die Abbildung der Kursspalten auf die Attribute des Thema_T-Typs eine Liste vom Typ Kursliste_T benötigt wird. Da hier eine Wiederholung benötigt wird, deren Daten über eine korrelierte Unterabfrage („für jeden Dozenten seine Kurse“) ermittelt werden, benötigt man zusätzlich noch die CAST()-Funktion, um die Daten in eine solche Kursliste zu übernehmen. Diese Funktion führt die Konversion durch, während die MULTISET()-Funktion gerade den Bereich angibt, der wiederholt auftreten wird.
Die Abbildung veranschaulicht noch einmal die Zuordnung von Datenstrukturen in der Datenbank in Form von Objekt- und Tabellentypen zu den Bereichen in der SQL-Abfrage, denen sie entsprechen.
Man erhält ein verschachteltes XML-Dokument als XMLType, das eine Dozentenliste und für jeden Dozenten seine Kursliste enthält.
Erzeugung von AggregatenEs existiert eine weitere Funktion, mit deren Hilfe Sie ein Eltern-Elemente angeben können. Eine Aggregation im Sinne von tatsächlich verschachtelten Ergebnissen lässt sich damit nicht einrichten. Wie Sie schon gesehen haben, liefert die SYS_XMLGEN()-Funktion immer mehrere Reihen. Dies lässt sich durch die SYS_XMLAGG()-Funktion verhindern, die ein Eltern-Element um sämtliche Reihen setzt:
Man erhält innerhalb des Eltern-Elements ROWSET alle weiteren gefundenen Kurse. Wichtig für die Verarbeitung ist hier, dass tatsächlich nur eine Reihe zurückgeliefert wird und daher bei einer entsprechenden Verarbeitung auch kein Cursor verwendet werden muss, um die gesamte Ergebnismenge zu durchlaufen.
XML-DokumentvorgabenEine letzte Möglichkeit besteht darin, für beide Funktionen noch das XMLFormat-Objekt zu verwenden, um weitere Formatierungen für das XML-Dokument anzugeben. Hierunter fällt auch die Angabe von passenden Eltern-Elementen.
Die folgende Abfrage verwendet zwei Formatvorgaben, um ebenfalls Eltern-Elemente mit einem passenden Namen zu versehen:
Man erhält folgende Ausgabe:
Die Abbildung stellt die Struktur des Dokuments schematisch dar: Innerhalb einer Dozentenliste befinden sich mehrere Dozenten, die jeweils ihre Themen in einer Kursliste besitzen. Diese Kurse stellen eine Sammlung von mehreren Kursen dar.
In der Übersichtsdarstellung für das gesamte Beispiel (siehe Abbildung 6.12) befinden sich alle drei Bausteine für die Abfrage in einer Datei. Zum einen benötigt man entsprechende Objekt- und Tabellentypen, die in der Datenbank gespeichert sind. Zum anderen bezieht sich die SQL-Abfrage genau auf diese Datenstrukturen, aus denen über die Funktion SYS_XMLGEN() die passende XML-Struktur erzeugt wird. Als dritte Komponente erhält man dann das eigentliche Dokument. Auch für diese Funktionen gilt wieder, dass sie sich als XMLType verarbeiten oder in der Datenbank für eine spätere Verarbeitung speichern lassen.
|
||