290 likes | 438 Views
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
E N D
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 XMLin 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: • Atomarer Wert • Knoten • 7 Knotenarten in Bäumen und Sequenzen • Dokumentknoten • Elementknoten • Attributknoten • Namensraumknoten • Verarbeitungsanweisungsknoten • Kommentarknoten • Textknoten • Nach bestimmten Regeln angeordnet
Exkurs: XQuery-Datenmodell E P V D V N E E E E E E N N N N T T T T N T E E C A A
Mehr Funktionen • Logische Konsequenz: Jede Knotenart benötigt eine Entsprechung in SQL
Mehr Funktionen SELECT XMLELEMENT ( NAME "angestellte", XMLATTRIBUTES (a.Gehalt),ID) AS Geringverdiener FROM Angestellte a WHERE Gehalt < 450 Beispiel: <angestellte Gehalt=„280“ > 123456 </angestellte> <angestellte Gehalt=„330“ > 123424 </angestellte> <angestellte Gehalt=„310“ > 123434 </angestellte> <angestellte Gehalt=„315“ > 113424 </angestellte>
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: • CREATETABLEAngest ( ID integer, xml_emp_dataXML(DOCUMENT(UNTYPED))) • CREATE TABLE Angest ( ID integer, xml_emp_dataXML(DOCUMENT(XMLSCHEMAURI ’http://...’)) • CREATE TABLE Angest ( ID integer, xml_emp_dataXML(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 XML-Werten 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 * FROMAngest WHERExml_emp_dataIS [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 XQuery-Datenmodells 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: SELECTtop_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 ) FROMbuyers
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.* FROMPurchaseOrders PO, XMLTable ( '//item' PASSING PO.XMLpo COLUMNS "Seqno" FOR ORDINALITY, "Part #" CHAR(6) PATH '@partnum', "ProdName" CHAR(20) PATH 'productName', "Quantity" INTEGER PATH 'quantity', "Price" DECIMAL(9,2) PATH 'USPrice', "Date" DATE PATH 'shipDate' ) AS X WHEREPO.KeyField = 1
XMLTable – virtuelle Tabelle • 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 „implementationdefined“