XML-Werte in SQL/XML Von Viktor Folmer Inhalt Datentyp XML Knotenfunktionen Unter- und Unter(unter)typen Validierung Prädikate Auswahl weiterer Funktionen Der Datentyp XML in SQL/XML:2003 Seit SQL/XML:2003 Basisdatentyp in SQL Speicherung von XML-Dokumenten als Wert in einer Tabellenspalte Grund: steigende Praxisrelevanz von XML … und weiterhin breiter Einsatz relationaler Datenbanken XML-Welt und SQL-Welt zusammenbringen ! Der Datentyp XML Vorher: Speicherung von XML in relationalen DBMS nur mit „Krücken“ ◦ varchar / CLOB ◦ shredding ◦ extender Seit 2003 Basisdatentyp „XML“ basiert auf Infoset Exkurs : Information Set abstrakte Datenzusammenstellung, die festschreibt, welche Informationen ein XML-Dokument enthält Infoset kann als Baum angesehen werden Ein XML-Dokument hat ein Infoset, wenn : ◦ es wohlgeformt ist und ◦ die Anforderungen der Namensräume erfüllt Auch ein ungültiges XML-Dokument kann ein Infoset besitzen Werte des Datentyps „XML“ in SQL/XML:2003 Zulässige Werte: (SQL-)Nullwert Wohlgeformtes XML-Dokument Nicht wohlgeformtes XML-Dokument (eingeschränkt) Validität (noch) nicht überprüfbar Datentyp „XML“ in SQL/XML:2006 Einordnung: Erweiterung von SQL/XML:2003 seit 2006 Teil von SQL:2003 Umstellung des Datentyps auf XQuery – Datenmodell Vorteile: Unterstützung von Sequenzen Erweiterung der Datentypen im XML-Dokument Exkurs: XQuery-Datenmodell Sequenz: Folge von Sequenzeinträgen: 7 Knotenarten in Bäumen und Sequenzen Nach bestimmten Regeln angeordnet ◦ Atomarer Wert ◦ Knoten ◦ ◦ ◦ ◦ ◦ ◦ ◦ Dokumentknoten Elementknoten Attributknoten Namensraumknoten Verarbeitungsanweisungsknoten Kommentarknoten Textknoten Exkurs: XQuery-Datenmodell E N N P V D E V E T E E E A N E T N C E T A N E T N T Mehr Funktionen Logische Konsequenz: Jede Knotenart benötigt eine Entsprechung in SQL Knotenarten im XQuery-Datenmodell Neue Funktionen in SQL/XML:2006 Dokumentknoten XMLDOCUMENT Elementknoten XMLELEMENT Attributknoten XMLATTRUBUTES Namensraumknoten XMLNAMESPACES Verarbeitungsanweisungsknoten XMLPI Kommentarknoten XMLCOMMENT Textknoten XMLTEXT Mehr Funktionen Beispiel: SELECT XMLELEMENT ( NAME "angestellte", XMLATTRIBUTES (a.Gehalt),ID) AS Geringverdiener FROM Angestellte a WHERE Gehalt < 450 Untertypen des Datentyps „XML“ SEQUENCE: beliebige Sequenz (Folge von Bäumen und/oder atomaren Werten) CONTENT: nur ein Baum mit einem D-Knoten als Wurzel in der Sequenz erlaubt. Wie viele E-Knoten Kinder des D-Knotens sind ist unwichtig DOCUMENT: wohlgeformte XML-Dokumente, nur ein Baum mit einem D-Knoten als Wurzel und nur ein E-Knoten als Kind Untertypen des Datentyps „XML“ Die Untertypen besitzen eine Hierarchie: Jeder XML-Wert vom Typ XML(DOCUMENT) ist gleichzeitig auch eine Instanz von XML(CONTENT) Jeder Wert vom Typ XML(CONTENT) ist eine Instanz von XML(SEQUENCE) Untertypen des Datentyps „XML“ XML(SEQUENCE) XML(CONTENT) XML(DOCUMENT) Unter(unter)Typen des Datentyps „XML“ Folgende Unter(unter)typen verfeinern die Untertypen XML(CONTENT) und XML(DOCUMENT): UNTYPED: nicht validierte XML-Dokumente, E-Knoten sind vom Typ untyped und dessen A-Knoten sind vom Typ untypedAtomic XMLSCHEMA: gegen ein bestimmtes Schema validiertes XML-Dokument ANY: der XML-Wert ist entweder gegen ein Schema validiert oder er ist es nicht Unter(unter)Typen des Datentyps „XML“ Syntax Beispiele: ◦ CREATE TABLE Angest ( ID integer, xml_emp_data XML(DOCUMENT(UNTYPED))) ◦ CREATE TABLE Angest ( ID integer, xml_emp_data XML(DOCUMENT(XMLSCHEMA URI ’http://...’)) ◦ CREATE TABLE Angest ( ID integer, xml_emp_data XML(DOCUMENT(ANY))) Validierung mit SQL Nicht nur einzelne Dokumente, sondern auch ganze Sequenzen können mit der Funktion XMLVALIDATE gegen ein bestimmtes Schema validiert werden Sequenz wird Baum für Baum überprüft Bei erfolgreicher Validierung werden die Knoten mit Typinformationen angereichert Validierung mit SQL Einschränkungen: In einer Sequenz dürfen bei der Validierung … Textknoten Attributknoten Namensraumknoten Atomare Werte nicht vorkommen Einzelne Bäume einer ungültigen Sequenz können über einen „Umweg“ doch validiert werden Prädikate Zum Test auf bestimmte Eigenschaften von XMLWerten stehen auch neue Prädikate zur Verfügung: ◦ IS DOCUMENT: prüft ob der XML-Wert den Eigenschaften eines XML-Dokuments (validiert oder ungültig) genügt ◦ IS CONTENT: prüft ob der XML-Wert ein Dokument im Sinne des XQuery-Datenmodells ist ◦ IS VALID: prüft ob ein XML-Wert einem bestimmten Schema genügt. Im Gegensatz zu XMLVALIDATE findet hier keine Typanreicherung statt. Prädikate Für alle diese Prüfungen gilt: Es wird lediglich ein Wahrheitswert zurückgegeben und die Daten bleiben unverändert Sie können z.B. in der WHERE –Klausel verwendet werden um nur Zeilen mit der jeweiligen Gültigkeit zu liefern Beispiel : SELECT * FROM Angest WHERE xml_emp_data IS [NOT] DOCUMENT Übergabe von Knoten Wird eine Sequenz zur Verarbeitung an eine SQL-Funktion übergeben, muss der Übergabemechanismus spezifiziert werden Dazu gibt es – wie bei Programmiersprachen – zwei unterschiedliche Methoden ◦ BY REF: Die Knoten der Sequenz selbst werden übergeben ◦ BY VALUE: Nur Kopien der Knoten werden übergeben Dazu wird das Konzept der Knotenidentität des XQueryDatenmodells genutzt. Alle Knoten haben eine Knotenidentität, nutzt man BY VALUE, bekommen die Kopien eine neue Knotenidentität. XMLQuery Bettet XQuery-Anfragen in SQL ein Kann nach bestimmten Werten einer SQL-Tabelle in XML-Dokumenten suchen Dies geschieht indem ein SQL-Wert an eine globale XQuery-Variable gebunden wird und diese Variable dann im XQuery-Ausdruck verwendet werden kann Die Rückgabe des XQuery-Ausdrucks an SQL erfolgt BY REF oder BY VALUE XMLQuery Beispiel: SELECT top_price, XMLQUERY ( ´ for $cost in /buyer/contract/item/amount where /buyer/name = $var1 return $cost ´ PASSING BY VALUE "F.Castro", AS var1 RETURNING SEQUENCE BY VALUE ) FROM buyers XMLTable Referenziert einen XML-Wert als eine Tabelle Im Gegensatz zum shredding keine Speicherung als Tabelle, sondern nur virtuell In SQL-Abfragen lassen sich die Elemente dann als Spalten ansprechen XMLTable SELECT X.* FROM PurchaseOrders PO, XMLTable ( '//item' PASSING PO.XMLpo COLUMNS "Seqno" FOR ORDINALITY, "Part #" CHAR(6) "ProdName" CHAR(20) "Quantity" INTEGER "Price" DECIMAL(9,2) "Date" DATE ) AS X WHERE PO.KeyField = 1 PATH PATH PATH PATH PATH '@partnum', 'productName', 'quantity', 'USPrice', 'shipDate' XMLTable – virtuelle Tabelle Seqno Part # ProdName Quantity Price Date 1 GA-564 Kettensäge 12 99.80 12.02.08 2 GA-520 Gartenschere 33 12.23 01.03.08 Nutzungsmöglichkeiten von XMLTable: Persistente Speicherung des „geshredderten“ XML-Wertes mit INSERT INTO Joins mit anderen Tabellen XMLCAST Konvertiert Werte von SQL nach XML und umgekehrt existierende CAST-Funktion nicht geeignet, da in vielen Produkten das „Casten“ von/nach XML bereits als Character-String implementiert ist Syntax: XMLCAST ( xml_data AS date) Entweder der Quell- oder der Zieldatentyp (oder auch beide) müssen XML sein Das Schlüsselwort EMPTY kann nach XML gecastet werden, um kinderlose Dokumentenknoten oder leere Sequenzen zu erzeugen XMLCAST (EMPTY AS XML(SEQUENCE)) Abschließende Worte zur Norm Entwicklung geht Richtung Ausbau der XML-Unterstützung Die Norm ist kein Gesetz Viele Bereiche sind auch in der Norm „implementation defined“ Vielen Dank