Kapitel 11 Kommerzielle Datenbanksysteme für die XML-Verarbeitung Oracle DB2 mit XML Extender Microsoft SQL Server Tamino Excelon Poet Infonyte Beispiel: XML-SchemaDokument <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Buch" type="Buch"/> <xsd:complexType name="Buch"> <xsd:sequence> <xsd:element name="Autor" type="xsd:string"/> <xsd:element name="Titel" type="xsd:string"/> <xsd:element name="Untertitel" type="xsd:string"/> <xsd:element name="Verlag"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="Ort" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <xsd:element name="Auflage" type="xsd:int" minOccurs="0"/> <xsd:choice minOccurs="0"> <xsd:element name="Covertext" type="xsd:string"/> <xsd:element name="Beschreibung" type="xsd:string"/> </xsd:choice> </xsd:sequence> <xsd:attribute name="ISBN" type="xsd:string"/> <xsd:attribute name="Jahr" type="xsd:gYear"/> </xsd:complexType> </xsd:schema> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-2 Beispiel: XML-Dokumente <Buch ISBN="3-89864-148-1" Jahr="2003"> <Autor>Meike Klettke</Autor> <Autor>Holger Meyer</Autor> <Titel>XML & Datenbanken</Titel> <Untertitel> XML-Dokumente effizient speichern und verarbeiten </Untertitel> <Verlag Ort="Heidelberg">dpunkt</Verlag> <Beschreibung>Mit der wachsenden ... </Beschreibung> </Buch> XML-Dokument buch1.xml <Buch ISBN="3-8266-00258-7" Jahr="1997"> <Autor>Gunter Saake</Autor> <Autor>Ingo Schmitt</Autor> <Autor>Can Türker</Autor> <Titel>Objektdatenbanken</Titel> <Untertitel> Konzepte, Sprachen, Architekturen </Untertitel> <Verlag Ort="Bonn"> International Thomson Publishing </Verlag> <Covertext>Dieses Lehrbuch ...</Covertext> </Buch> XML-Dokument buch2.xml <Buch ISBN="3-89864-219-4" Jahr="2003"> <Autor>Can Türker</Autor> <Titel>SQL:1999 & SQL:2003</Titel> <Untertitel> Objektrelationales SQL, SQLJ & SQL/XML </Untertitel> <Verlag Ort="Heidelberg">dpunkt</Verlag> <Beschreibung>SQL ist ... </Beschreibung> </Buch> <Buch ISBN="3-89864-228-3" Jahr="2003"> <Autor>Gunter Saake</Autor> <Autor>Kai-Uwe Sattler</Autor> <Titel>Datenbanken & Java</Titel> <Untertitel>JDBC, SQLJ, ODMG & JDO</Untertitel> <Verlag>dpunkt</Verlag> <Auflage>2</Auflage> <Beschreibung> Das Zusammenspiel ... </Beschreibung> </Buch> XML-Dokument buch4.xml XML-Dokument buch3.xml Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-3 Oracle9i: Architektur Anwendung XML-Dokumente Oracle9i Oracle verfolgt den SQL/XML-Ansatz Datenbank Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-4 Oracle9i: Architekturübersicht (1) Abbildung aus "Oracle9i - XML Database Developer’s Guide - Oracle XML DB, Release 2 (9.2), March 2002" Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-5 Oracle9i: Architekturübersicht (2) Abbildung aus "Oracle9i - XML Database Developer’s Guide - Oracle XML DB, Release 2 (9.2), March 2002" Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-6 Oracle9i: Speicheroptionen Abbildung aus "Oracle9i - XML Database Developer’s Guide - Oracle XML DB, Release 2 (9.2), March 2002" Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-7 Speicherungsstruktur: Abbildung von XML auf Datenbanken z Varianten zur Abbildung von XML auf Datenbanken – – z Ausnutzung der objektrelationalen Erweiterung von Oracle – – – – – z XML-Column-Ansatz: Spalte basiert auf XML-Datentyp XML-Table-Ansatz: Tabelle basiert auf XML-Datentyp XMLTYPE als vordefinierter Objekttyp mit SQL/XML-Funktionen als Methoden Intermedia-Text-Paket mit Volltextfunktionalität DBMS_XMLDOM-Paket mit DOM-Methoden DBMS_XMLSCHEMA-Paket mit Methoden zur Verwaltung und Generierung von XML-Schemata DBMS_XMLGEN-Paket mit Methoden zur Generierung von XML aus SQL Speicherungsansätze – – – textbasiert (unstrukturierte Speicherung als CLOB) strukturbasiert (objektrelationale Speicherung setzt XML-Schema voraus) hybrid (semistrukturiert) Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-8 Oracle9i: Speichervarianten Abbildung aus "Oracle9i - XML Database Developer’s Guide - Oracle XML DB, Release 2 (9.2), March 2002" Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-9 XML-Column-Ansatz vs. XML-Table-Ansatz Tabelle mit XML-Spalte CREATE TABLE <Tabellenname> (<Spaltenname> XMLTYPE) [XMLTYPE [COLUMN] <Spaltenname> [STORE AS { OBJECT RELATIONAL | CLOB (<LOB-Parameter>) }] [XMLSCHEMA <url> ELEMENT [<url>#]<Element>]] strukturbasierte Speicherung (erfordert Angabe eines passenden XML-Schemas) textbasierte Speicherung Default: CLOB Tabelle mit XML-Zeile CREATE TABLE <Tabellenname> OF XMLTYPE [XMLTYPE STORE AS { OBJECT RELATIONAL | CLOB (<LOB-Parameter>) }] [XMLSCHEMA <url> ELEMENT [<url>#]<Element>]] Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-10 Benutzerdefinierte Funktion getDocument(datei) zum Einlesen von XML-Dokumenten CREATE DIRECTORY xmldir AS 'c:\xmldir'; GRANT READ ON DIRECTORY xmldir TO PUBLIC WITH GRANT OPTION; CREATE FUNCTION getDocument(filename VARCHAR2) RETURN CLOB AUTHID CURRENT_USER IS xbfile BFILE; xclob CLOB; BEGIN xbfile := BFILENAME('xmldir', filename); DBMS_LOB.open(xbfile); DBMS_LOB.createTemporary(xclob, TRUE, DBMS_LOB.session); DBMS_LOB.loadFromFile(xclob, xbfile, DBMS_LOB.getLength(xbfile)); DBMS_LOB.close(xbfile); RETURN xclob; END; / Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-11 XML-Column-Ansatz z Definition einer Tabelle zur Aufnahme von XML-Dokumenten CREATE TABLE Buch ( Inhalt XMLTYPE ); z Einfügen von Dokumenten INSERT INTO Buch VALUES (XMLTYPE('<Buch ISBN="3-89864-148-1" Jahr="2003"> <Autor>Meike Klettke</Autor> <Autor>Holger Meyer</Autor> ... </Buch>')); INSERT INTO Buch VALUES (XMLTYPE(getDocument('buch1.xml'))); Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-12 XML-Table-Ansatz z Definition einer Tabelle zur Aufnahme von XML-Dokumenten CREATE TABLE Buch OF XMLTYPE ; z Einfügen von Dokumenten INSERT INTO Buch VALUES (XMLTYPE('<Buch ISBN="3-89864-148-1" Jahr="2003"> <Autor>Meike Klettke</Autor> <Autor>Holger Meyer</Autor> ... </Buch>')); INSERT INTO Buch VALUES (XMLTYPE(getDocument('buch1.xml'))); Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-13 Behandlung von XML-Schemata z Package DBMS_XMLSCHEMA bietet Routinen zum Registrieren, Übersetzen, Generieren und Löschen von XML-Schemata DBMS_XMLSCHEMA.registerSchema('Schema-URL', 'XML-Schema'); DBMS_XMLSCHEMA.compileSchema('Schema-URL'); DBMS_XMLSCHEMA.generateSchema('Schema', 'Typname'); DBMS_XMLSCHEMA.deleteSchema('Schema-URL', DeleteOption); DELETE_RESTRICT DELETE_INVALIDATE DELETE_CASCADE DELETE_CASCADE_FORCE CONSTANT NUMBER := 1; CONSTANT NUMBER := 2; CONSTANT NUMBER := 3; CONSTANT NUMBER := 4; Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-14 Erzeugen einer schemabasierten XML-Tabelle z Registrierung des XML-Schemas BEGIN DBMS_XMLSCHEMA.registerSchema('buch.xsd', getDocument('buch.xsd')); END; / z Erzeugen der XML-Tabelle CREATE TABLE Buch OF XMLTYPE XMLSCHEMA "buch.xsd" ELEMENT "Buch"; ist äquivalent zu CREATE TABLE Buch OF XMLTYPE ELEMENT "buch.xsd#Buch"; Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-15 Methoden des XML-Datentyps XMLTYPE (1) z XMLTYPE(<Wertausdruck>) ist der Konstruktor – Wertausdruck kann eine Zeichenkette oder eine Instanz eines benutzerdefinierten Typs sein z getClobVal() liefert XML-Wert als CLOB z getStringVal() liefert XML-Wert als Zeichenkette z getNumVal() ist nur anwendbar auf einem XML-Wert, der einen Textknoten darstellt, dessen Zeichenkette einer Nummer entspricht z isFragment() liefert 1, wenn Instanz mehr als ein Wurzelelement hat z existsNode(<XPath-Ausdruck>) liefert 1 oder 0, je nach dem, ob der XPathAusdruck einen Knoten liefert oder nicht z extract(<XPath-Ausdruck>) extrahiert einen Teil des XML-Wertes entsprechend eines XPath-Ausdruckes Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-16 Methoden des XML-Datentyps XMLTYPE (2) z transform(<XML-Wertausdruck>) transformiert einen XML-Wert gemäss einem anderen XML-Wert, der ein Stylesheet repräsentiert z toObject() konvertiert einen XML-Wert in einen Objektwert z isSchemaBased() liefert 1, wenn der XML-Wert aus einen vorgegebenen Schema basiert z getSchemaURL() liefert die URL des Schemas z getRootElement() liefert das Wurzelelement (bei XML-Fragmenten Null) z createSchemaBasedXML(<Schema-URK>) fügt dem XML-Wert ein Schema hinzu z createNonSchemaBasedXML() hebt die Assoziation zu einem Schema auf (falls eine vorhanden war) Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-17 Anfragen z Unterstützung des SQL/XML-Standards – – – – z Plus weitere Funktionen wie – – – – z XMLAGG XMLELEMENT XMLATTRIBUTE XMLFOREST XMLSEQUENCE XMLCOLATTVAL EXTRACT EXISTSNODE etc. Volltextsuche durch Einbindung des Intermedia-Text-Pakets Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-18 XML-Funktionen z basieren auf den XMLTYPE-Methoden z Auswahl von Oracle-XML-Funktionen – – – – – – – – – – – – XMLTYPE erzeugt einen XML-Wert aus einem CLOB EXTRACT extrahiert Knoten mittels eines XPath-Ausdruckes EXTRACTVALUE extrahiert einen Knoten mittels eines XPath-Ausdruckes EXISTSNODE überprüft, ob ein bestimmter Knoten existiert XMLELEMENT erzeugt ein XML-Element aus einer Werteliste XMLATTRIBUTES erzeugt XML-Attribute XMLCOLATTVAL liefert einen Wald von XML-Elementen mit Tag <column> XMLFOREST erzeugt einen Wald von XML-Elementen XMLCONCAT konkateniert mehrere XML-Elemente zu einem Wald XMLAGG aggregriert die XML-Elemente einer Gruppe XMLUPDATE manipuliert einen XMLWert … Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-19 XMLTYPE (1) XMLTYPE(<Zeichenkettenausdruck> ) erzeugt einen XML-Wert Beispiel: Mitarbeiter Name Gehalt Joe 2000 Jim 3500 SELECT XMLTYPE('<Mitarbeiter Name="' || Name || '"> <Gehalt>' || 12 * Gehalt || '</Gehalt> </Mitarbeiter>') AS Angestellte FROM Mitarbeiter; Angestellte Simulation von XMLGEN partiell möglich (beschränkt auf XPathAusdrücke; kein XQuery)! Vergleiche mit dem entsprechenden Beispiel aus Kapitel 7 (SQL/XML) Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) <Mitarbeiter Name="Joe"> <Gehalt>24000</Gehalt> </Mitarbeiter> <Mitarbeiter Name="Jim"> <Gehalt>42000</Gehalt> </Mitarbeiter> 11-20 XMLTYPE (2) SELECT XMLTYPE('<Autoren>' || EXTRACT(VALUE(b), '//Autor') || '</Autoren>') AS Autorennamen FROM Buch b; AUTORENNAMEN <Autoren> <Autor>Meike Klettke</Autor> <Autor>Holger Meyer</Autor> </Autoren> <Autoren> <Autor>Gunter Saake</Autor> <Autor>Ingo Schmitt</Autor> <Autor>Can Türker</Autor> </Autoren> <Autoren> <Autor>Can Türker</Autor> </Autoren> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) <Autoren> <Autor>Gunter Saake</Autor> <Autor>Kai-Uwe Sattler</Autor> </Autoren> 11-21 EXTRACTVALUE EXTRACTVALUE(<XML-Wertausdruck>, <XPath-Ausdruck>[,<Wertausdruck>]) extrahiert einen durch eine XPath-Anfrage definierten Ausschnitt des XML-Wert, der einem einzelnen Knotenwert entspricht Beispiel: SELECT EXTRACTVALUE(VALUE(b), '//@ISBN') AS ISBNummer, EXTRACTVALUE(VALUE(b), '//Titel') AS Buchtitel FROM Buch b; ISBNUMMER BUCHTITEL 3-89864-148-1 XML & Datenbanken 3-8266-00258-7 Objektdatenbanken 3-89864-219-4 SQL:1999 & SQL:2003 3-89864-228-3 Datenbanken & Java Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-22 EXTRACT EXTRACT(<XML-Wertausdruck>, <XPath-Ausdruck>[, <Namensraum>]) extrahiert einen durch eine XPath-Anfrage definierten Ausschnitt des XML-Wertes Beispiel: SELECT EXTRACT(VALUE(b), '//@ISBN') AS ISBNummer, EXTRACT(VALUE(b), '//Titel/text()') AS Titel_Inhalt, EXTRACT(VALUE(b), '//Titel') AS Titel_Element FROM Buch b; ISBNUMMER TITEL_INHALT TITEL_ELEMENT 3-89864-148-1 XML &amp; Datenbanken <Titel>XML &amp; Datenbanken</Titel> 3-8266-00258-7 Objektdatenbanken <Titel>Objektdatenbanken</Titel> 3-89864-219-4 SQL:1999 &amp; SQL:2003 <Titel>SQL:1999 &amp; SQL:2003</Titel> 3-89864-228-3 Datenbanken &amp; Java Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) <Titel>Datenbanken &amp; Java</Titel> 11-23 EXISTSNODE EXISTSNODE(<XML-Wertausdruck>, <XPath-Ausdruck> [, <Namensraum>]) ergibt 1, wenn die Anfrage auf dem XML-Wert ein nicht-leeres Ergebnis liefert Beispiel: SELECT EXTRACTVALUE(VALUE(b), '//Titel') AS Buchtitel, EXTRACTVALUE(VALUE(b), '//Verlag') AS Verlagsname, EXTRACTVALUE(VALUE(b), '//Autor[1]') AS Erstautor FROM Buch b WHERE EXISTSNODE(VALUE(b), '//Buch[@ISBN="3-8266-00258-7"]') = 1; BUCHTITEL VERLAGSNAME Objektdatenbanken International Thomson Publishing Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) Erstautor Gunter Saake 11-24 XMLELEMENT XMLELEMENT(NAME <Elementname> [, XMLATTRIBUTES(<XML-Attributliste>)] [, <Wertausdrucksliste>]) <XML-Attribut> := <Wertausdruck> [AS <Attributname>] erzeugt ein XML-Element Beispiel: SELECT XMLELEMENT(NAME "ISBNummer", XMLATTRIBUTES(EXTRACTVALUE(VALUE(b), '//Titel') AS TITEL), EXTRACT(VALUE(b), '//@ISBN')) AS ISBN_Element FROM Buch b; ISBN_ELEMENT <ISBNummer TITEL="XML &amp; Datenbanken">3-89864-148-1</ISBNummer> <ISBNummer TITEL="Objektdatenbanken">3-8266-00258-7</ISBNummer> <ISBNummer TITEL="SQL:1999 &amp; SQL:2003">3-89864-219-4</ISBNummer> <ISBNummer TITEL="Datenbanken &amp; Java">3-89864-228-3</ISBNummer> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-25 XMLCOLATTVAL XMLCOLATTVAL(<XML-Spaltenwerteliste>) <XML-Spaltenwerte>:=<Wertausdruck> [AS <Elementname>] erzeugt XML-Elemente aus SQL-Wertausdrücken Beispiel: SELECT XMLCOLATTVAL(EXTRACTVALUE(VALUE(b), '//Titel') AS Buchtitel, EXTRACTVALUE(VALUE(b), '//Autor[1]') AS Erstautor) AS Buchtitelautor FROM Buch b WHERE EXISTSNODE(VALUE(b), '//Autor[text()="Gunter Saake"]') = 1; BUCHTITELAUTOR <column name="BUCHTITEL">Objektdatenbanken</column> <column name="ERSTAUTOR">Gunter Saake</column> <column name="BUCHTITEL">Datenbanken &amp; Java</column> <column name="ERSTAUTOR">Gunter Saake</column> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-26 XMLFOREST XMLFOREST(<XML-Forest-Elementliste>) <XML-Forest-Element>:=<Wertausdruck> [AS <Elementname>] erzeugt einen Wald von XML-Elementen mit optionalen Attributen Beispiel: SELECT XMLFOREST(EXTRACTVALUE(VALUE(b), '//Titel') AS Buchtitel, EXTRACTVALUE(VALUE(b), '//Autor[1]') AS Erstautor) AS Buchtitelautor FROM Buch b WHERE EXISTSNODE(VALUE(b), '//Autor[text()="Gunter Saake"]') = 1; BUCHTITELAUTOR <BUCHTITEL>Objektdatenbanken</BUCHTITEL> <ERSTAUTOR>Gunter Saake</ERSTAUTOR> <BUCHTITEL>Datenbanken &amp; Java</BUCHTITEL> <ERSTAUTOR>Gunter Saake</ERSTAUTOR> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-27 XMLCONCAT XMLCONCAT(<XML-Wertausdrucksliste>) konkateniert XML-Elemente zu einem Wald Beispiel: SELECT XMLCONCAT(EXTRACT(VALUE(b), '//Titel'), EXTRACT(VALUE(b), '//Autor[1]')) AS Buchtitelautor FROM Buch b WHERE EXISTSNODE(VALUE(b), '//Autor[text()="Gunter Saake"]') = 1; BUCHTITELAUTOR <Titel>Objektdatenbanken</Titel> <Autor>Gunter Saake</Autor> <Titel>Datenbanken &amp; Java</Titel> <Autor>Gunter Saake</Autor> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-28 XMLAGG XMLAGG(<XML-Wertausdruck>[ORDER BY, <Sortierausdrucksliste>] ) aggregiert die XML-Elemente einer Gruppe Beispiel: SELECT EXTRACTVALUE(VALUE(b), '//Verlag') AS Verlag, XMLAGG(EXTRACT(VALUE(b), '//Titel')) AS Titel FROM Buch b GROUP BY EXTRACTVALUE(VALUE(b), '//Verlag'); VERLAG TITEL International Thomson Publishing XML & Datenbanken dpunkt <Titel>XML &amp; Datenbanken</Titel> <Titel>Datenbanken &amp; Java</Titel> <Titel>SQL:1999 &amp; SQL:2003</Titel> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-29 XMLSEQUENCE XMLSEQUENCE(<XML-Wertausdruck>) erzeugt aus XML-Elementen ein Array von XML-Werten Beispiel: ISBN SELECT EXTRACTVALUE(VALUE(b), '//@ISBN') AS ISBN, XMLSEQUENCE(EXTRACT(VALUE(b), '//Autor')) AS Autoren FROM Buch b WHERE EXISTSNODE(VALUE(b), '//Autor[text()="Gunter Saake"]') = 1; AUTOREN 3-8266-00258-7 XMLSEQUENCETYPE(XMLTYPE(<Autor>Gunter Saake</Autor>), XMLTYPE(<Autor>Ingo Schmitt</Autor>), XMLTYPE(<Autor>Can Türker</Autor>)) 3-89864-228-3 XMLSEQUENCETYPE(XMLTYPE(<Autor>Gunter Saake</Autor>), XMLTYPE(<Autor>Kai-Uwe Sattler</Autor>)) Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-30 Indexierung z Indexunterstützung – Volltextindex CREATE INDEX xmlfulltextidx ON Buch b (VALUE(b)) INDEXTYPE IS CTXSYS.CONTEXT; – Pfadindex CREATE INDEX xmlpfadidx ON Buch b (VALUE(b)) INDEXTYPE IS CTXSYS.CTXXPATH; – Funktionaler Index (Wertindex) CREATE INDEX xmlfunktionalidx ON Buch (EXTRACTVALUE(VALUE(b),'//@Jahr')); Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-31 Indexausnutzung z Anfrage, die den Pfadindex nutzt: SELECT EXTRACTVALUE(VALUE(b), '//Titel') AS Titel FROM Buch b WHERE EXISTSNODE(VALUE(b),'/Buch/Verlag[text()="dpunkt"]') = 1; z Anfrage, die den Volltextindex nutzt: SELECT SCORE(0), EXTRACT(VALUE(b), '//@ISBN') AS ISBN FROM Buch b WHERE CONTAINS(VALUE(b), 'Java', 0) > 0 ORDER BY SCORE(0) DESC; z Anfrage, die den funktionalen Index nutzt: SELECT EXTRACTVALUE(VALUE(b), '//Titel') AS Titel FROM Buch b WHERE EXTRACTVALUE(VALUE(b),'//@Jahr') = 2003; Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-32 Manipulation — UPDATEXML UPDATEXML(<XML-Wertausdruck>, <Ersetzungsliste>[,<Namensraum>]) <Ersetzung> := <XPath-Ausdruck>,<Wert-Ausdruck> ändert einen durch eine XPath-Anfrage definierten Ausschnitt des XML-Wertes Beispiel: UPDATE Buch b SET VALUE(b) = UPDATEXML(VALUE(b), '//Verlag[text()="dpunkt"]/@Ort', 'Zürich'); Buch SYS_NC_ROWINFO$ <Buch ISBN="3-89864-148-1" Jahr="2003"> ... <Verlag Ort="Zürich">dpunkt-Verlag</Verlag> ... </Buch> <Buch ISBN="3-8266-00258-7" Jahr="1997"> ... <Verlag Ort="Bonn">International Thomson Publishing</Verlag> ... </Buch> <Buch ISBN="3-89864-219-4" Jahr="2003"> ... <Verlag Ort="Zürich">dpunkt-Verlag</Verlag> ... </Buch> <Buch ISBN="3-89864-228-3" Jahr="2003"> ... <Verlag Ort="Zürich">dpunkt-Verlag</Verlag> ... </Buch> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-33 XML-Sichten z ermöglichen XML-basierte Sicht auf SQL- bzw. XML-Werte z basieren auf dem Prinzip der Objektsichten – z der Objekttyp ist hier XMLTYPE Beispiel: CREATE VIEW DpunktBuch OF XMLTYPE WITH OBJECT ID DEFAULT AS SELECT VALUE(b) FROM Buch b WHERE EXISTSNODE(VALUE(b), '//Verlag[text()="dpunkt"]') = 1; Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-34 Export von Datenbankinhalten mit XML-Syntax z Standardabbildung: SQL ô XML mit – – – – – – – DBMS_XMLGEN.getXML('Anfrage') Spalten ergeben Elemente der ersten Ebene (top level) Einfache Typen (mit skalaren Werten) als Elemente mit PCDATA Strukturierte Typen und ihre Attribute auf Elemente mit Subelementen für die Attribute abgebildet Komplexe Attribute als hierarchisch geschachtelte Elemente Aus Kollektionstypen werden Listen von Elementen Objektreferenzen und referenzielle Integritätsbedingungen werden auf ID/IDREF innerhalb eines Dokuments abgebildet Tabelleninhalt wird auf ROWSET-Elemente abgebildet <ROWSET> <ROW num="1"> … </ROW> … <ROW num="n"> … </ROW> </ROWSET> z Benutzerdefinierte Transformation von SQL nach XML mit XSLT möglich Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-35 Zusammenfassung Oracle-XML-Unterstützung XML-Speicherung Modell erweiterbar, objektrelational Schemabeschreibung Validierung möglich Art der Speicherung text- oder strukturbasiert Abbildungen von DB auf XML durch XML-Funktionen, Schemageneratoren, XML-Sichten XML-Datentyp vorhanden Indexe Wert-/Funktionsindex vorhanden Volltextindex vorhanden Pfadindex vorhanden Anfragen und Manipulation Anfragen SQL-Methoden mit XPath 1.0 Volltextsuche mit dem Intermedia-Text-Erweiterungspaket Manipulationen SQL-Methoden mit XPath 1.0 Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-36 Kritik des Ansatzes von Oracle z Gute Unterstützung von Standards – – – z Besonderheiten: – – – – z XPath 1.0 XML-Schema SQL/XML XML-Sichten Tools für Export und Import von XML-Schemata XSLT-Prozessor, XML-Prozessoren (DOM, SAX), XML-Schema Validator Problem: zu viele parallele, redundante Ansätze – – Konsolidierung erforderlich! Hier nicht weiter betrachtet! Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-37 IBM DB2 mit XMLExtender: Architektur Anwendung XML-Dokumente DAD – Document Access Definition DB2 XML Extender IBM DB2 Datenbank Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) DateiDateisystem Dateisystem Dateisystem system 11-38 Abbildung zwischen XML und SQL Abbildungen aus "IBM DB2 Universal Database XML Extender Administration and Programming, Version 8 2002" Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-39 Speicherungsstruktur: Abbildung von XML auf Datenbanken z Varianten zur Abbildung von XML auf Datenbanken – – z XML-Column-Ansatz: basiert auf XML-Datentyp XML-Collection-Ansatz: basiert auf Zerlegung der XML-Dokumente in Datenbanktabellen und -spalten Tabellen mit XML-Spalten (Ansatz: XML-Column) – Diverse XML-Datentypen – XML-Dokumente als CLOBs gespeichert XML-Dokumente als VARCHARs gespeichert XML-Dokumente im Dateisystem gespeichert Zusätzliche materialisierte Sichten: – XMLCLOB: XMLVARCHAR: XMLFILE: Extraktion von ausgewählten XML-Inhalten aus den Dokumenten Materialisierung dieser Inhalte in sog. Seitentabellen Seitentabellen werden in der Document Access Definition (DAD) definiert Methoden zur Verarbeitung von XML-Dokumenten ergänzen XML-Datentypen besprechen wir später Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-40 Erzeugen der Tabellen mit XML-Typen und Einfügen von Dokumenten z Einrichten der XML-Erweiterungen für die Datenbank über XML Extender Admin Wizard oder Command Window > dxxadm enable_db XMLDB z XMLDB heisst hier unsere Beispieldatenbank Definition der Tabellen zur Aufnahme von XML-Dokumenten – – Variante 1: Erzeugen mit dem XML Extender Admin Wizard Variante 2: SQL CREATE TABLE Buch ( Inhalt DB2XML.XMLVARCHAR ) z Einfügen eines XML-Dokuments INSERT INTO Buch (Inhalt) VALUES (DB2XML.XMLVARCHARFromFile('C:\XMLDIR\buch01.xml')) Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-41 Definition der Abbildung durch eine DAD mit dem XML-Column-Ansatz z Document Access Definition (DAD) – z Beschreibung der Abbildungen zwischen XML und Datenbanktabellen über ein XML-Dokument, das sog. DAD-Dokument (im Dateisystem) Syntax für den XML-Column-Ansatz (spezifiziert in dad.dtd von IBM): – Tabellen-Element: <table> – name="tabname" Spalten-Element: <column> z Attribut Tabellenname: Attribut Spaltenname: Attribut Datentyp: Attribut Pfad im XML-Dokument: name="colname" type="typespecifier" path="XPath-" multi_occurrence="boolean" Beim Registrieren der DAD werden die Seitentabellen und Trigger zu deren Wartung automatisch erzeugt C:\> dxxadm enable_column DBName Tabellenname XMl-Attributname DADName z Beispiel: C:\> dxxadm enable_column XMLDB Buchlob Inhalt buch.dad Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-42 Beispiel für eine XML-Column-DAD <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE DAD SYSTEM "C:\XMLDIR\dad.dtd"> IBM's DTD für DAD's <DAD> <dtdid>buch.dtd</dtdid> Angabe einer DTD, die <validation>YES</validation> das DAD erfüllen muss <Xcolumn> <table name="Buch"> <column name="ISBN" type="VARCHAR(20)" path="/Buch/@ISBN" multi_occurrence="NO"/> <column name="Jahr" type="VARCHAR(4)" path="/Buch/@Jahr" multi_occurrence="NO"/> <column name="Titel" type="VARCHAR(80)" path="/Buch/Titel" multi_occurrence="NO"/> <column name="Untertitel" type="VARCHAR(80)" path="/Buch/Untertitel" multi_occurrence="NO"/> <column name="Verlag" type="VARCHAR(50)" path="/Buch/Verlag" multi_occurrence="NO"/> <column name="Verlagsort"type="VARCHAR(50)" path="/Buch/Verlag/@Ort" multi_occurrence="NO"/> <column name="Auflage" type="VARCHAR(2)" path="/Buch/Auflage" multi_occurrence="NO"/> </table> <table name="Buchautor"> <column name="Autor" type="VARCHAR(50)" path="/Buch/Autor" multi_occurrence="YES"/> </table> </Xcolumn> Autoren können in </DAD> den Dokumenten mehrfach auftreten Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-43 XML-Column-Ansatz für die Beispiel-Dokumente XML-Tabelle Buchlob DADSpezifikation ROOT_ID Inhalt Aus der DAD generiert das DBMS automatisch die korrespondierenden Seitentabellen 1 <Buch>...</Buch> 2 <Buch>...</Buch> Seitentabelle Buchautor 3 <Buch>...</Buch> ROOT_ID SEQNO Autor Trigger überwachen Laden der Dokumente 1 1 Meike Klettke 1 2 Holger Meyer 2 1 Gunter Saake ... ... ... Seitentabelle Buch ROOT_ID ISBN Jahr Titel 1 3-89864-148-1 2003 XML & Datenbanken XML-Dok … dpunkt Heidelberg — 2 3-8266-0258-7 1997 Objektdatenbanken 3 3-89864-219-4 2003 SQL:1999 & SQL:2003 Objekt … dpunkt Heidelberg — 4 3-89864-228-3 2003 Datenbanken & Java dpunkt Heidelberg 2 Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) Untertitel Verlag Konzepte, … ITP JDBC, … Verlagsort Auflage Bonn — 11-44 Definition der Abbildung durch eine DAD mit dem XML-Collection-Ansatz z Zerlegung von XML-Dokumenten z Abbildung von XML auf Datenbank – – z dxxInsertXML() dxxShredXML() arbeitet auf XML-Kollektionen mit fester DAD arbeitet auf XML-Kollektionen mit variabler DAD Abbildung von Datenbank auf XML – – dxxRetrieveXML() dxxGenXML() arbeitet auf XML-Kollektionen mit fester DAD arbeitet auf XML-Kollektionen mit variabler DAD z Aufruf dieser Stored Procedures nur aus einem Anwendungsprogramm möglich!!! z Aufruf aus dem Anwendungsprogramm ist nicht akzeptabel, daher hier nicht weiter ausgeführt Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-45 Definition der Abbildung durch eine DAD mit dem XML-Collection-Ansatz z DAD-DTD stellt verschiedene XML-Elemente zur Verfügung, um die Abbildung zwischen Datenbank und XML festzulegen – – – Element SQL_stmt: Element prolog: Element element_node: – Element attribute_node: – z Attribut name: Attribut name: Element column: Angabe einer SQL-Anfrage Angabe des Prologs zum XML-Dokument Definition von Zielelementen Tag des Zielelements dito XML-Attribute Name des Zielattributs Bezug zur Spalte im Anfrageergebnis Umgekehrte Abbildung von XML auf Datenbankinhalten ist auch möglich – – Element RDB_node anstelle von SQL_stmt Angabe von Tabellennamen und evtl. Join-Bedingungen Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-46 Vorgehen: Abbildung von SQL nach XML z Spezifiziere XML-Collection-DAD (z.B. buchcol.dad; siehe nächste Folie) z Erzeuge entsprechende Zieltabelle, die eine XML-Spalte enthält CREATE TABLE result_tab (Inhalt DB2XML.XMLVARCHAR) z Generiere XML-Collection (Fülle Zieltabelle mit generierten XML-Werten) C:\> dxxgenx XMLDB C:\XMLDIR\buchcol.dad result_tab Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-47 Beispiel für eine XML-Collection-DAD <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE DAD SYSTEM "C:\XMLDIR\dad.dtd"> <DAD> <validation>NO</validation> <Xcollection> <SQL_stmt> SELECT ISBN, Titel, Verlag, Verlagsort FROM Buch ORDER BY ISBN </SQL_stmt> <prolog>?xml version="1.0"?</prolog> <root_node> <element_node name="Buch"> <attribute_node name="ISBN"> <column name="ISBN"/> </attribute_node> <element_node name="Titel"> <text_node><column name="Titel"/></text_node> </element_node> <element_node name="Verlag"> <attribute_node name="Ort"> <column name="Verlagsort"/> </attribute_node> <text_node><column name="Verlag"/></text_node> </element_node> </element_node> </root_node> </Xcollection> </DAD> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-48 Generierte XML-Collection SELECT * FROM result_tab <?xml version="1.0"?> <Buch ISBN="3-8266-0258-7"> <Titel>Objektdatenbanken</Titel> <Verlag Ort="Bonn">International Thomson Publishing</Verlag> </Buch> <?xml version="1.0"?> <Buch ISBN="3-89864-148-1"> <Titel>XML &amp; Datenbanken</Titel> <Verlag Ort="Bonn">dpunkt</Verlag> </Buch> <?xml version="1.0"?> <Buch ISBN="3-89864-219-4"> <Titel>SQL:1999 &amp; SQL:2003</Titel> <Verlag Ort="Bonn">dpunkt</Verlag> </Buch> <?xml version="1.0"?> <Buch ISBN="3-89864-228-3"> <Titel>Datenbanken &amp; Java</Titel> <Verlag Ort="Bonn">dpunkt</Verlag> </Buch> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-49 Anfragen z XML-Extender – – XML-Erweiterung bietet Funktionen für Anfragen und Manipulationen Extract-Funktionen: DB2XML.EXTRACT<Datentyp>(<XML-Wertausdruck>, <XPath-Ausdruck>) – Beispiel: SELECT a.RETURNEDVARCHAR FROM Buchlob, TABLE(DB2XML.EXTRACTVARCHARS(Inhalt, '//Autor')) a z Begrenzte Unterstützung des SQL/XML-Standards – – – XMLAGG XMLELEMENT XMLATTRIBUTE Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-50 ExtractXXX(<XML-Wertausdruck>, <XPath-Ausdruck>) Abbildung aus "IBM DB2 Universal Database XML Extender Administration and Programming, Version 8, 2002" Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-51 XMLVARCHAR DB2XML.XMLVARCHAR(<Zeichenkettenausdruck> ) erzeugt einen XML-Wert Beispiel: SELECT DB2XML.XMLVARCHAR('<isbn>' || ISBN || '</isbn>') AS ISBN_Element FROM Buch ISBN_ELEMENT <ISBNummer>3-89864-148-1</ISBNummer> <ISBNummer>3-8266-00258-7</ISBNummer> <ISBNummer>3-89864-219-4</ISBNummer> <ISBNummer>3-89864-228-3</ISBNummer> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-52 XMLELEMENT XMLELEMENT(NAME <Elementname> [, XMLATTRIBUTES(<XML-Attributliste>)] [, <Wertausdrucksliste>]) <XML-Attribut> := <Wertausdruck> [AS <Attributname>] erzeugt ein XML-Element Beispiel: SELECT VARCHAR(XML2CLOB(XMLELEMENT( NAME "ISBNummer", XMLATTRIBUTES(Titel), ISBN))) AS ISBN_Element FROM Buch ISBN_ELEMENT <ISBNummer TITEL="XML &amp; Datenbanken">3-89864-148-1</ISBNummer> <ISBNummer TITEL="Objektdatenbanken">3-8266-00258-7</ISBNummer> <ISBNummer TITEL="SQL:1999 &amp; SQL:2003">3-89864-219-4</ISBNummer> <ISBNummer TITEL="Datenbanken &amp; Java">3-89864-228-3</ISBNummer> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-53 XMLAGG XMLAGG(<XML-Wertausdruck> aggregiert die XML-Elemente einer Gruppe Beispiel: SELECT Verlag, VARCHAR(XML2CLOB(XMLAGG(XMLELEMENT(NAME "Titel", Titel)))) AS Titel FROM Buch GROUP BY BY Verlag VERLAG TITEL International Thomson Publishing XML & Datenbanken dpunkt <Titel>XML &amp; Datenbanken</Titel> <Titel>Datenbanken &amp; Java</Titel> <Titel>SQL:1999 &amp; SQL:2003</Titel> Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-54 Manipulation z Manipulationen über spezielle Methoden der XML-Typen möglich z Syntax: DB2XML.UPDATE(<XML-Wertausdruck>, <XPath-Ausdruck>, <NeuerWert>) z Beispiel UPDATE Buchlob SET Inhalt = DB2XML.UPDATE(Inhalt, '//Verlag[text()="dpunkt"]/@Ort', 'Zürich') z Mit dem XML-Column-Ansatz werden die Änderungen automatisch auf den Seitentabellen nachgezogen Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-55 Indexierung z Indexunterstützung – – z Wertindexe (B-Baum, Bitmap, etc.) auf den Seitentabellen Volltextindex (mit Text Extender) auf den XML-Typen Erweiterung des Volltextindex für IR auf XML – – – Mitführen der Pfadinformation im Index Unterstützung für Pfadausdrücke Beispiel: contains-Ausdruck enthält im zweiten Parameter eine Query für den Text Extender SELECT Inhalt FROM Buchlob WHERE contains(dscrHandel, ‘MODEL order SECTION(//Buch/Covertext) "Datenbank"‘) = 1 Retrievalmodell Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) Pfadausdruck zur Einschränkung der Suche 11-56 Zusammenfassung IBM DB2 XML-Unterstützung XML-Speicherung Modell erweiterbar, objektrelational Schemabeschreibung Validierung bei Import möglich Art der Speicherung textbasiert oder benutzerdefiniert-strukturbasiert Abbildungen von DB auf XML durch DAD XML-Datentyp vorhanden Indexe Wertindex Standard-DBS-Indexe auf Seitentabellen Volltextindex mit TextExtender Pfadindex nur im TextExtender Anfragen und Manipulation Anfragen SQL-Methoden mit XPath-Dialekt Volltextsuche mit TextExtender Manipulationen SQL-Methoden mit XPath-Dialekt Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-57 Kritik des Ansatzes von DB2 z Schlechte Unterstützung von Standards – – – z Schlechte Integration der Tools mit dem Komplettsystem bzw. SQL – z DAD statt XML-Schema Eigener XPath-Dialekt anstatt XPath 1.0 Keine volle Unterstützung von SQL/XML Umständliches Aktivieren von XML-Unterstützung für Datenbanken, Tabellen Unnötige Koexistenz verschiedener, teilweise redundanter Ansätze – Beispiel: XML-Unterstützung durch XML Extender vs. SQL/XML-Funktionalität z Keine Unterstützung modellbasierter Abbildungen z Vieles befindet sich offensichtlich noch im Beta-Stadium, auch wenn es offiziell schon lange released ist! Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 11-58