Start
Unternehmen
Buch-Katalog
Seminare
Leserservice
Comelio-Blog
Datenbanken
SQL
MS SQL Server
Oracle

Trigger

Module

Pakete

SQLX

SysXMLGen

XDB: Sichten

XDB: XML Schema

XDB: XSLT

XDB: XMLType

XDB: Konzepte

XDB: PL/SQL

XML-Speicheransätze

SQLJ

PHP
UML
C#.NET
XML Schema
XSLT

Übersicht

Comelio GmbH
Rellinghauser Straße 10
D-45128 Essen
Deutschland
Fon: 0201-437517-0
Fax: 0201-437517-10
info@comelio.com

Comelio GmbH
Goethestraße 34
D-13086 Berlin
Deutschland
info@comelio.com

Comelio GmbH (Ecos)
Glockengießerwall 17
D-20095 Hamburg
Deutschland
info@comelio.com

Comelio GmbH (Ecos)
Mainzer Landstraße 27-31
D-60329 Frankfurt
Deutschland
info@comelio.com

Comelio GmbH (Ecos)
Stiglmaierplatz/Dachauer Str. 37
D-80335 München
Deutschland
info@comelio.com

Comelio GmbH (Ecos)
Liebknechtstr. 33
D-70565 Stuttgart
Deutschland
info@comelio.com

Comelio GmbH
Nevinghoff 16
D-48147 Münster
Deutschland

Comelio GmbH
Friedrich - List - Platz 1
D-04103 Leipzig
Deutschland

Comelio GmbH
St. Johanner Strasse 41-43
D-66111 Saarbrücken
Deutschland

Comelio GmbH
Kaiser-Wilhem-Ring 27–29
D-50672 Köln
Deutschland

Comelio GmbH
Münsterstraße 248
D-40470 Düsseldorf
Deutschland

Comelio GmbH
Fürther Strasse
D-90429 Nürnberg
Deutschland

Comelio GmbH

Bremen
Deutschland

Comelio-Blog > Oracle > XDB: XMLType

XML DB: Der Datentyp XMLType

Sowohl für die Arbeit mit der XML-Datenbank Oracle XDB als auch für die Verwendung in traditionellen Speicheransätzen leistet der spezielle Datentyp XMLType in Oracle gute Dienste. Mit seinen eingebauten Unterprogrammen bietet er Möglichkeiten zur direkten und sehr einfachen Validierung, Transformation und Extrahierung von Daten. Er fällt durch seine umfassenden Möglichkeiten aus der Gruppe der anderen Datentypen heraus und soll in diesem Artikel übersichtsartig vorgestellt werden.

Kontakt

Anrede* Herr Frau
Vorname*
Nachname*
Firma
E-Mail*
Tel-Nr.
Bereich*
Freitext

Oracle XDB: Verwendung von XMLType

Der Datentyp XMLType ist der zentrale Datentyp für die Verarbeitung und Speicherung von XML in Oracle. Er tauchte bereits an verschiedenen Stellen in den zurückliegenden Beispielen auf. Allerdings wurden auch immer wieder XML-Strukturen durch CLOBs oder Zeichenketten repräsentiert. Dies ist grundsätzlich nicht verwerflich, es ist jedoch normalerweise nicht notwendig bzw. im Falle von längeren oder verschachtelten Strukturen eher hinderlich. Der spezielle XML-Datentyp weist viele Fähigkeiten auf, die ihn von anderen Datentypen unterscheiden und die ihn für die XML-Verarbeitung besonders geeignet machen. Zu diesen speziellen Eigenschaften zählen die teilweise schon vorgestellten Bereiche:

  • PL/SQL DOM API für XMLType (Paket DBMS_XMLDOM) zur Adressierung und Verarbeitung von XML sowie zur Erzeugung und Manipulation von bestehenden XML-Strukturen.
  • XMLType-Objekte: Diese Objekte können schema- oder nicht-schema-basiert sein.
  • PL/SQL XML Parser API für XMLType (Paket DBMS_XMLPARSER) für die Durchführung von Parsing-Vorgängen auf XML-Strukturen.
  • PL/SQL XSLT Prozessor für XMLType (Paket DBMS_XSLPROCESSOR): Für die Transformation von XML-Daten mit Hilfe des XSLT-Standards.
Die spezielle API für die Arbeit mit XMLType-Daten erlaubt die Erstellung von XMLType-Tabellen, Spalten und Sichten sowie die Adressierung und Bearbeitung solcher Daten.

Unterprogramme von XMLType

Betrachtet man die gerade erwähnten Programmiertechniken und APIs, in denen XMLType zum Einsatz kommt, lässt sich festhalten, dass man mit diesem speziellen Datentyp XML-Dokumente sowohl in SQL als auch in PL/SQL in Form eines Variablendatentyps speichern kann. Zusätzlich besitzt er eine Reihe von Unterprogrammen, die direkt auf entsprechende Spalten und Variablen angewandt werden können. Sie ermöglichen eine Untersuchung, Validierung und Transformation der entsprechenden Daten. In diesen Einsatzbereichen wird eine spezielle Punkt-Syntax verwendet, die für andere Datentypen nicht vorhanden ist und in PL/SQL auch neuartig erscheint. Sie beeinflusst allerdings die Arbeit von XML und SQL bzw. PL/SQL sehr günstig und erleichtert die Arbeit mit XML insgesamt sehr.

Diese Methoden bzw. Unterprogramme von XMLType sind:

  • XMLType(): Konstruktor, der eine Instanz eines XMLType-Datentyps erzeugt, wobei CLOB- oder VARCHAR2-Werte sowie Objekttypen übernommen werden. Die Schema-Angabe ist in allen Konstruktoren optional.
  • createXML(): Statische Funktion, mit der eine XMLType-Instanz erzeugt wird.
  • existsNode(): Prüft anhand eines XPath-Ausdrucks, ob in der angegebenen XMLType-Instanz passende Knoten vorhanden sind (Rückgabewert 1) oder nicht (Wert 0).
  • extract(): Liefert anhand eines XPath-Ausdrucks in der angegebenen XMLType-Instanz passende Knoten.
  • isFragment(): Prüft, ob die übergebene XMLType-Instanz ein Dokumentfragment ist oder nicht. Dabei stellt ein Dokumentfragment eine XML-Struktur mit mehreren Wurzelelementen dar, wie sie von manchen Abfragen zurückgeliefert werden können.
  • getClobVal(): Liefert den Wert der XMLType-Instanz als CLOB.
  • getNumVal(): Liefert den Wert der XMLType-Instanz als NUMBER-Wert zurück. Dabei muss der entsprechende Textknoten konvertierbar sein.
  • getStringVal(): Liefert den Wert der XMLType-Instanz als Zeichenkette.
  • transform(): Transformiert die übergebene XMLType-Instanz unter Einsatz einer XSLT-Datei als XMLType-Instanz in HTML, Text etc.
  • .
  • toObject(): Konvertiert die XMLType-Instanz zu einem Objekttyp.
  • isSchemaBased(): Liefert 1 zurück, wenn die XMLType-Instanz auf einem Schema basiert, oder 0, wenn sie allein steht.
  • getSchemaURL(): Liefert die XML Schema-URL, wenn eine vorhanden ist.
  • getRootElement(): Liefert das Wurzelelement oder NULL bei einem Fragment.
  • createSchemaBasedXML(): Erzeugt ein Schema als XMLType von einer XMLType-Instanz ohne Schema-Verknüpfung.
  • createNonSchemaBasedXML(): Erzeugt eine XMLType-Instanz ohne Schema-Verknüpfung.
  • getNamespace(): Liefert den Namensraum des Wurzelelements eines schema-basierten Dokuments.
  • schemaValidate(): Validiert die Eingabedaten einer XMLType-Instanz auf Basis eines XML Schemas.
  • isSchemaValidated(): Prüft, ob die XMLType-Instanz validiert wurde.
  • setSchemaValidated(): Setzt das positive Validierungsergebnis von vorneherein fest, um eine Validierung zu verhindern.
  • isSchemaValid(): Prüft, ob die XMLType-Instanz gültig ist.

Einsatz bei Tabellen und Spalten

Dieser Abschnitt zeigt, wie XMLType für Variablen und Tabellen bzw. Spalten eingesetzt werden kann. Dabei legen wir insbesondere jetzt auf die Unterprogramme Wert bzw. greifen noch einmal Beispiele auf, die noch nicht unter dem speziellen XMLType-Blickwinkel betrachtet worden sind oder die auch neue Eigenschaften vorführen, die in den anderen Beispielen zu DOM, XSLT etc. noch nicht in Erscheinung traten.

Verwendung bei der Datenerfassung

XMLType stellt trotz seiner Methoden und seiner daher herausragenden Eigenschaften einen ganz gewöhnlichen Datentyp dar. Er lässt sich als Datentyp für Variablen genauso verwenden wie für Tabellenspalten. Im nächsten Beispiel erstellen wir eine sehr einfache Tabelle, in der ein skalarer, d. h. einfacher Datentyp mit einer XMLType-Spalte kombiniert wird. Sie soll zu einem gegebenen Kurs die zugehörigen Termine speichern.

Bei einer Einfügeoperation über INSERT lässt sich mit Hilfe des XMLType()-Konstruktors eine Zeichenkette direkt in XML umwandeln bzw. als XMLType charakterisieren. Alternativ lässt sich natürlich auch eine geeignete Unterabfrage verwenden, wie es im aktuellen Beispiel gezeigt wird. Um nicht noch zusätzliche Objekttypen oder Tabellentypen zu verwenden, setzt man hier SQLX ein. Man muss dabei darauf achten, dass die entsprechende Unterabfrage in SQL wie in PL/SQL nur eine Zeile zurückliefert. Daher wird innerhalb der XMLElement()-Funktion noch einmal für eine Aggregierung bzw. tiefere Verschachtelung die XMLAgg()-Funktion eingesetzt, sodass nur eine Zeile mit einem Terminliste-Element zurückgeliefert wird, das wiederum mehrere Termin-Elemente enthält.

-- Tabelle anlegen
CREATE TABLE termin_d(
t_knr NUMBER(7),
t_xml XMLTYPE);
/
-- Werte einfügen
INSERT INTO termin_d 
SELECT K_Nr, (SELECT XMLElement("Terminliste", 
                      XMLAgg(XMLElement("Termin",
                             XMLAttributes(T_Nr AS "Nr"),
                       XMLForest(T_Beginn AS "Beginn",
                                 T_Ende AS "Ende",
                                 K_Nr AS "Kurs")))) 
                FROM termin b WHERE b.K_Nr = a.K_Nr) AS XML
FROM termin a
WHERE T_Ort = 'Düsseldorf';
/
-- Werte abfragen
SELECT * FROM termin_d;

Die Abfrage der Tabelle liefert dann bei ausreichend Platz im Puffer sowohl den einfachen Wert der Kursnummer in der ersten Spalte als auch das XML-Dokument in der zweiten Spalte. Insgesamt erhält man sieben Datensätze zurück, da in der TERMIN-Tabelle sieben Kurse auch in Düsseldorf angeboten werden.

  T_KNR   T_XML
---------------------

 1015024   
              
                 27.09.03
                 30.09.03
                 1015024
               
               
                 28.09.03
                 30.09.03
                 1015024
               
…
7	Zeilen ausgewählt.

Verwendung bei Abfragen

Sobald man XML in einer Tabelle gespeichert hat, stellt sich die Frage, wie man auf diese Daten zugreift, sofern man nicht – wie gerade eben – die gesamte Tabelle ausgeben möchte. Über die Methode extract() erhält man einen Teilbaum des XML-Dokuments in der Zeile zurück, der über einen XPath-Ausdruck bestimmt wird. Die Methode existsNode() prüft dagegen, ob ein Knoten überhaupt existiert, und lässt sich gut in WHERE-Klauseln einsetzen, um die Übernahme einer Zeile in die Ergebnismenge von der Existenz eines Knotens abhängig zu machen. Entweder man lässt das XML ausgeben, wenn der verwendete Editor diese Ausgabe unterstützt, oder man setzt zusätzlich die Funktionen getStringVal(), getClobVal() oder getNumVal() ein, um die zurückgelieferte Ergebnismenge in eine Zeichenkette, einen CLOB oder eine Zahl zu konvertieren.

SELECT extract(t_xml, '//Termin').getStringVal() AS XML
  FROM termin_d
WHERE t_KNr = 1015068;

Bei der zuvor gestellten Abfrage, die nur Termine zurückliefern sollte, deren Kursnummer 1015068 beträgt, erhält man drei Zeilen und die XML-Daten als VARCHAR2-Zeichenkette.

XML
<Termin Nr="498">
  <Beginn>10.06.03</Beginn>
  <Ende>13.06.03</Ende>
  <Kurs>1015068</Kurs>
</Termin>
…
3 Zeilen ausgewählt.

Skalare Werte lassen sich bei Attributen direkt über die Angabe des Attributs in der Attributachse ermitteln, da diese ja keinen Textknoten enthalten. Elemente hingegen enthalten einen Textknoten, sodass hier die Funktion text() zum Einsatz kommen muss. Das Ergebnis ist dann keine XML-Struktur, sondern ausschließlich eine Zeichenkette (Zahl oder Buchstaben), die den Inhalt der ausgewählten Elemente enthält.

SELECT extract(t_xml, '//Termin/Beginn/text()')
       AS Beginn,
       extract(t_xml, '//Termin/Ende/text()')
       AS Ende
  FROM termin_d
WHERE t_KNr = 1015068;

Verwendung bei Manipulation

Um die Manipulation von XML-Daten zu erläutern, löschen und füllen wir die gerade erstellte Tabelle erneut mit einem einzigen Datensatz, den wir dann verändern. Bei der Aktualisierung durch den SQL-Befehl UPDATE lässt sich ausschließlich eine Ersetzung des gesamten XML-Dokuments in der Zeile erreichen. Dabei verwendet man ebenfalls den XMLType()-Konstruktor wie bei der Einfügeoperation über INSERT.

Ganz anders verhält es sich mit der speziellen Methode updateXML() von XMLType, die zunächst eine Auswahl über XPath zulässt, um dann nur den selektierten Bereich durch den angegebenen Wert bzw. den angegebenen XMLType zu ersetzen. Dies ermöglicht es, auch nur kurze Teilbereiche einer XML-Struktur zu aktualisieren, ohne jeweils die gesamte Struktur zu verwenden.

-- Eintragen
INSERT INTO termin_d VALUES(1015068, XMLType('<Termin Nr="498">
    <Beginn>10.06.03</Beginn>
    <Ende>13.06.03</Ende>
    <Kurs>1015068</Kurs>
  </Termin>'));
-- Ändern durch Ersetzen
UPDATE termin_d
   SET t_xml = XMLType('<Termin Nr="498">
     <Beginn>10.06.04</Beginn>
     <Ende>13.06.04</Ende>
     <Kurs>1015068</Kurs>
   </Termin>')
WHERE t_knr = 1015068;
-- Test
SELECT * FROM termin_d;
-- Suche nach Wert
SELECT extract(t_xml, 'Termin/@Nr').getStringVal()
  FROM termin_d;
-- Ändern durch updateXML()
UPDATE termin_d
   SET t_xml = updateXML(t_xml, 'Termin/@Nr','782')
 WHERE extract(t_xml, 'Termin/@Nr').getStringVal()='498';
-- Test
SELECT * FROM termin_d;</code></pre>
<p>Man erhält tatsächlich eine Aktualisierung durch eine Ersetzung über den einfachen UPDATE-Befehl sowie eine punktuelle Ersetzung durch die XPath-Lokalisierung über die Methode updateXML().</p>
<pre><code>     T_KNR  T_XML
------------------
   1015068  <Termin Nr="498">
              <Beginn>10.06.04</Beginn>
              <Ende>13.06.04</Ende>
              <Kurs>1015068</Kurs>
            </Termin>

EXTRACT(T_XML,'TERMIN/@NR').GETSTRINGVAL()
498
1 Zeile wurde ausgewählt.

     T_KNR  T_XML
-------------------
   1015068  <Termin Nr="782">
              <Beginn>10.06.04</Beginn>
              <Ende>13.06.04</Ende>
              <Kurs>1015068</Kurs>
            </Termin>
1 Zeile wurde ausgewählt.

Die Methode updateXML() erweist sich als noch nützlicher, als eben schon gezeigt worden ist. Sie ermöglicht nicht nur eine punktuelle Änderung über eine XPath-Lokalisierung, sondern bietet darüber hinaus auch eine passende Syntax, um mehrfache Änderungen auszuführen. Dazu wird das Paar „XPath-Ausdruck Ersetzung“ mehrfach durch Kommata getrennt aneinander gereiht. So lässt sich die im ersten Beispiel über UPDATE ausgeführte Änderung auch unter Ausschluss der Kursnummer mit Hilfe von updateXML() durchführen.

-- Eintragen
INSERT INTO termin_d VALUES(1015068, XMLType('<Termin Nr="498">
    <Beginn>10.06.03</Beginn>
    <Ende>13.06.03</Ende>
    <Kurs>1015068</Kurs>
  </Termin>'));
-- Ändern durch mehrfaches updateXML()
UPDATE termin_d
   SET t_xml = updateXML(t_xml, 'Termin/@Nr','782',
                         'Termin/Beginn/text()', '10.06.04',
                         'Termin/Ende/text()', '13.06.04')
 WHERE extract(t_xml, 'Termin/@Nr').getStringVal()='498';
-- Test
SELECT * FROM termin_d; 

Das Ergebnis enthält dann die erstellten Änderungen.

     T_KNR  T_XML
---------------------
 1015068   <Termin Nr="782">
             <Beginn>10.06.04</Beginn>
             <Ende>13.06.04</Ende>
             <Kurs>1015068</Kurs>
           </Termin>
1 Zeile wurde ausgewählt.

Je nach ihrer Position innerhalb des SQL-Befehls eignet sich die updateXML()-Methode auch für eine nur flüchtige Änderung von Daten in der Ergebnismenge, nicht aber in den tatsächlichen Datenbankdaten. In diesem Sinne lässt sie sich für Abfragen verwenden, in den kurzfristig Daten geändert werden sollen. Dies lässt sich auch für Sichten nutzen, in denen sensible Daten einer bestimmten Nutzergruppe nicht angezeigt werden sollen, aber durchaus im XML-Dokument enthalten sind. Da es im XML-Bereich gerade nicht mit einer einfachen Spaltenauswahl getan ist, wenn Daten nicht angezeigt werden sollen, muss man die updateXML()-Methode einsetzen.

    Comelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn MünchenComelio GmbH Oracle XDB: XML DB - XMLType XML DB Oracle Programmierung Programmierung PL/SQL Datenbank-Entwicklung Anleitung Manual XML Oracle SQLJ Java Tutorial Stuttgart Ingolstadt Erlangen Freiburg Ol Kiel Aachen Zwickau Köln Ludwigshafen Kassel Koblenz Koblenz Frankfurt Bremen Rügen Mannheim Leipzig Magdeburg Andernach Würzuburg Bochum Wolfsburg Lübeck Heidelberg Göttingen Berlin Hannover Hamburg Bonn München
Seminare