<Insert Picture Here> XML und die Oracle Datenbank Ulrike Schwinn ([email protected]) ORACLE Deutschland B.V. & Co.KG Realisierung mit der Datenbank • Ein einziges zentrales Repository • Einheitlicher Administrationsbereich • Nutzung der Backup/Recovery- und Security• • • • Funktionen (Kontrolle!) der Datenbank Einfache Werkzeuge Einfache Integration aller Techniken über SQL Massendatenverarbeitung und Performance • Indizierung, Partitionierung, Parallelisierung, Laden der Daten usw. Alles ohne zusätzliche Installation in der Datenbank enthalten Der integrierte Ansatz Gib mir alle stornierten Aufträge, bei denen von "Lieferkosten" die Rede ist und der Kunde nicht mehr als 20km von der Niederlassung "1234" entfernt wohnt SELECT p.id, p.name, xmlquery('po/quantity' passing po_xml returning content) quantity FROM product p, order_queue oq, customer c, store s WHERE s.store_id = 1234 Relational Message AND oq.msg_state = 'CANCELED' XML AND xmlquery('/po/product_id‘ passing po_xml returning content)= p.id Text AND xmlquery('/po/cust_id‘ passing o_xml)= c.cust_ids AND contains(p.notes,fuzzy('Lieferkosten'), 1) > 0 AND sdo_within_distance(c.location, s.location,'distance=20')='TRUE' Location All Your Information in der Datenbank • Früher: • Speicher für relationale Daten • Spezialisierte Daten ausserhalb des Datenbanksystems • Heute: • Spezielle Datentypen und Indizes für Informationssysteme verschiedenster Arten • Methoden zur Verarbeitung • Realisierung: • Nutzung von Objekttypen und speziellen Indizes (Domain Indizes) XML DB Spatial & Ontologien Multimedia Text & Mining Relationale Daten XML in der Oracle Datenbank - Kurzprofil • XML und SQL innerhalb der Datenbank • Standardkonform ( W3C, SQL:2003…) • XML/SQL • XQuery • XML Schema, DOM • Verfügbar ab Oracle 9i Release 2 • Alle Datenbank Editionen – keine Lizenz erforderlich • Keine zusätzliche Installation erforderlich – geringer Konfigurationsaufwand Oracle XML DB: Die Versionen Binary XML & XML Index XQuery XML API’s O/R Speicherung TEXT Speicherung & XML DB Repository 1998 2001 2004 2007 Oracle XML DB - Schnittstellen Oracle XML DB XQuery XPath SQL Transformationen XML- Sichten SQL*Net HTTP / WebDAV FTP Recherchen Relationale Sichten Zugriffe: HTTP Zugriffe: WEBDAV • WebDAV Protocol Specification, http://www.ietf.org/rfc/rfc2518.txt Zugriffe: FTP • Per default ist FTP disabled • Kommandos wie pwd,quit,del,rmd,user,type Das XMLDB Repository • File/Folder-Sicht auf eine Repository-Tabelle • PL/SQL-Zugriff via DBMS_XDB • Basis für FTP und WebDAV • Zugriffskontrolle mit ACL • Versionierung • Links • Metadatenverwaltung XML DB Installation • Überprüfen ob Funktionalität installiert ist mit dba_registry • Falls Funktionalität nicht installiert 1. XML DB Repository installieren mit $ORACLE_HOME/rdbms/admin/catqm.sql 2. HTTP- und FTP -Listener aktivieren $ORACLE_HOME/rdbms/admin/catxdbdbca.sql XML DB Konfiguration Administration im Enterprise Manager Welche Speichermöglichkeiten für XML? 1. Relationale Speicherung 2. Large Object (speziell als CLOB) 3. „XML aware“ Speicherung mit speziellem Datentyp Datentypen Oracle Datentypen Built-In Datentypen CHAR(n), NCHAR(n) VARCHAR2(n), NVARCHAR2(n) RAW(n), LONG RAW ROWID, UROWID NUMBER BINARY_FLOAT, BINARY_DOUBLE DATE BLOB, CLOB, NCLOB, BFILE TIMESTAMP INTERVAL Supplied Data Types XML Type Media Types Spatial Types Any Types User-Defined Types Object types Varying Array (VARRAY) Nested Table Ref Der Datentyp XMLTYPE • Verwendbar wie jeder andere Datentyp • in der Spalten- oder Tabellendefinition • in PL/SQL Logik • Unterstützt unterschiedliche Speicherformen Eigenschaften von XMLTYPE • • • • • • Ist ein Oracle "build in" Datentyp Zugriff mit XPATH Funktionen und anderen Schnittstellen möglich Enthält wohlgeformtes XML Dokument Kann als CLOB, Objektrelational oder Binary XML gespeichert werden Kann Schema konform gespeichert werden Besitzt XMLTYPE Methodenfunktionen/Konstruktoren in PL/SQL, C oder Java • Beispiel: Enthält Methoden um Schema Validierung und XSL Transformation durchzuführen Datentyp XMLTYPE - Beispiele • Tabelle anlegen CREATE TABLE xml_tab (x_doc XMLTYPE) XMLTYPE COLUMN x_doc STORE AS [clob | object relational | binary xml] • Beispiel: Objektrelationale Speicherung CREATE TABLE order_tab( id number(10), order_doc xmltype ) xmltype column order_doc store as object relational xmlschema "http://xmldb.oracle.com/purchaseOrder" element "purchaseOrder" Intern: Textbasierte Speicherung SQL> SELECT object_value FROM xml_text WHERE rownum=1; OBJECT_VALUE --------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://localhost:8080/home/SCOTT/poSource/ xsd/purchaseOrder.xsd"> <Reference>EABEL-20031209123338324PDT</Reference> <Actions> <Action>... SQL> SELECT e.xmldata FROM xml_text e WHERE rownum=1; OBJECT_VALUE --------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://localhost:8080/home/SCOTT/poSource/ xsd/purchaseOrder.xsd"> <Reference>EABEL-20031209123338324PDT</Reference> <Actions> <Action>... Intern: Objektrelationale Speicherung SQL> SELECT object_value FROM xml_struct WHERE rownum=1; OBJECT_VALUE --------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://localhost:8080/home/SCOTT/poSource/ xsd/purchaseOrder.xsd"> <Reference>EABEL-20031209123338324PDT</Reference> <Actions> <Action>... SQL> SELECT e.xmldata FROM xml_struct e WHERE rownum=1; XMLDATA(SYS_XDBPD$, REFERENCE, ACTIONS(SYS_XDBPD$, ACTION(SYS_XDBPD$, ACTIONED_B --------------------------------------------------------------PURCHASEORDER_T(XDB$RAW_LIST_T('23FF0102008400008801003F687474703A2F2F6C6 F63616C686F73743A383038302F686F6D652F53434F54542F706F536F757263652F787364 2F70757263686173654F726465722E787364000102030405060708'), 'EABEL20031209123338324PDT', ACTION Intern: Binary XML Speicherung SQL> SELECT object_value FROM xml_bin WHERE rownum=1; OBJECT_VALUE --------------------------------------------------------<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://localhost:8080/home/SCOTT/poSource/ xsd/purchaseOrder.xsd"> <Reference>EABEL-20031209123338324PDT</Reference> <Actions> <Action>... SQL> SELECT e.xmldata FROM xml_bin e WHERE rownum=1; XMLDATA ---------------------------------------------------------------9F01639E000000B203000000030001787369C85DA1DD0001C03E0015687474703A2F2F6C6 F63616C686F73743A383038302F686F6D652F53434F54542F706F536F757263652F787364 2F70757263686173654F726465722E787364C01956E1454142454C2D32303033313230393 13233333338333234504454C83A7CC81AAAC007033F455A4C4F544B4559D9D9C08F3AB8C0 0C1F54456C6C656E20532E204162 Speicherungsformen – Überlegungen I 1. Zugriffe Nur auf ganze Dokumente <document id="2"> <element date="2007-0 <action> <member name="Ora : Textbasierte Speicherung Auf einzelne Dokumentknoten 2. XML Schema ... Speicherungsformen – Überlegungen II 2. XML Schema Nicht vorhanden 110100100100111000100 100101010111010001110 111001000111100001111 100010011110100001000 111100011100011111001 Binary XML vorhanden 3. Flexibilität ... Speicherungsformen – Überlegungen III XML Schema wird sich häufig ändern 3. Flexibilität XML Schema wird stabil sein 110100100100111000100 100101010111010001110 111001000111100001111 100010011110100001000 111100011100011111001 Binary XML Objektrelational Entscheidung über Speicherungsform • Drei Fragen führen zur richtigen Speicherungsform • Zugriffe auf ganze Dokumente oder auf Dokumentteile? • Liegt ein XML Schema vor oder nicht? • Wird sich das XML Schema ändern oder stabil bleiben? • Richtige Speicherungsform ist entscheidend! • Performance-Unterschied: Faktoren • Durch Tuning (Index, I/O) nicht einzuholen Beispiel XML: PURCHASEORDER Objektrelationale Speicherung XML Schema in der Datenbank • XML_Schema "Registrierung„ über • PL/SQL Paket (DBMS_XMLSCHEMA) • Oracle Enterprise Manager ⇒ Nachbildung der XML-Strukturen als Oracle Objekttypen CREATE OR REPLACE TYPE "SCOTT"."PURCHASEORDER_T" AS OBJECT(..."XDB"."XDB$RAW_LIST_T"," Reference" VARCHAR2(26 CHAR),"Actions" "ACTION_T","Reject" "REJECT_T","LineItems" "LINEITEMS_T") FINAL INSTANTIABLE ... CREATE TABLE "SCOTT"."PURCHASEORDER" OF SYS.XMLTYPE XMLSCHEMA http://www,oracle.com/xdb/po.xsd ... Abfrageoptimierung mit Query Rewrite SELECT xmlquery(...), ... FROM PURCHASEORDER Objektrelational gespeicherte Query Rewrite SELECT SYS_NC000015$, ... FROM PURCHASEORDER XML-Dokumente PurchaseOrder PurchaseOrder PurchaseOrder PurchaseOrder PurchaseOrder * *LineItem LineItem * *LineItem LineItem LineItem 11User 11User User User User Ausführung ohne Query Rewrite DOM Parsing SELECT xmlquery(...), ... FROM PURCHASEORDER DOM-Baum wkn XML-Dokument XML Index • XML Index für Speicherungsformen ... • Textbasiert und Binary XML • Nicht für objektrelationale Speicherung hier wie schon immer: B-Tree Indizes CREATE INDEX xml_index ON purchaseorder(object_value) indextype is xdb.xmlindex parameters ( 'PATHS (INCLUDE (/PurchaseOrder/User) (/PurchaseOrder/LineItems)' ) Indizierung • B-Tree Index (Nur objektrelationale Speicherung) • Indizierung einzelner Knoten oder Attribute • Function Based Index (Alle Speicherungsformen) • Oracle TEXT-Index (Alle Speicherungsformen) • Volltextrecherche, aber keine Bereichssuche • XML Index (Text- und Binary XML-Speicherung) • Fragment-Indizierung möglich • Auch ohne spezielles Vorwissen der XPATH Ausdrücke zu verwenden Relationale Sichten auf XML Dokumente Oracle XML DB XQuery XPath SQL Transformationen XML- Sichten SQL*Net HTTP / WebDAV FTP Recherchen Relationale Sichten Relationale Sichten PURCHASEORDER Reference Username SBELL-20030709333763PDT SBELL . . : : : : : : : Beispiel SQL Funktionen – Lesender Zugriff • Nutzung von Funktionen wie XMLQUERY(), XMLTABLE(), XMLEXISTS() etc. • Beispiel für XMLQUERY SELECT xmlquery('for $i in /PurchaseOrder/LineItems/LineItem return $i' PASSING object_value RETURNING CONTENT) as ausgabe FROM purchaseorder WHERE rownum=1; Zugriff mit SQL – XMLQUERY • Das Ergebnis AUSGABE -----------------------------------------------------------<LineItem ItemNumber="1"> <Description>The Night Porter</Description> <Part Id="37429145227" UnitPrice="29.95" Quantity="1"/> </LineItem> <LineItem ItemNumber="2"> <Description>Rififi</Description> <Part Id="37429155622" UnitPrice="29.95" Quantity="3"/> </LineItem> <LineItem ItemNumber="3"> Zugriff mit SQL – XMLTABLE • Beispiel SELECT x.reference, x.username, x.costcenter FROM purchaseorder p, xmltable( '/PurchaseOrder' passing object_value columns reference varchar2(30) path '/PurchaseOrder/Reference', username varchar2(30) path '/PurchaseOrder/User', costcenter varchar2(10) path '/PurchaseOrder/CostCenter' ) x Zugriff mit SQL – XMLTABLE • Das Ergebnis REFERENCE USERNAME COSTCENTER ------------------------------ ---------- ---------SBELL-2003070912333763PDT SBELL S30 SKING-20030709123336952PDT SKING A10 SMCCAIN-20030709123336972PDT SMCCAIN A10 LSMITH-20031209123338535PDT LSMITH R20 PTUCKER-20031209123338565PDT PTUCKER S30 SBELL-20031209123338304PDT SBELL S30 SBELL-20031209123338505PDT SBELL S30 ... SQL Funktionen zum Bearbeiten • DML-Kommandos für XML • • • • • updateXML() insertChildXML() appendChildXML() insertXMLbefore() deleteXML deleteXML() • Piecewise Updates = Performance! • Bei objektrelationaler Speicherung XML- Sichten auf relationale Dateien Oracle XML DB XQuery XPath SQL Transformationen XML- Sichten SQL*Net HTTP / WebDAV FTP Recherchen Relationale Sichten XML-Sichten ... ganz einfach EMP EMPNO ENAME JOB 7369 . : SMITH . : CLERK : http://server:port/oradb/database_schema/table_name XML-Sichten Ein Beispiel ... EMP und DEPT DEPT 1 * EMP SQL/XML-Funktionen • XMLElement() • XMLAttributes() • XMLForest • XMLAgg() • XMLConcat() • XMLComment() • XMLCDATA() • XMLPI() • XMLRoot() • XMLSerialize() • ... XML-Sichten ... mit SQL SELECT xmlelement("Department", xmlattributes(deptno as "id"), xmlelement("name", d.dname), xmlagg(xmlelement ("DepartmentWorker", xmlattributes(e.empno as "id"), xmlforest(e.ename as "ename",e.sal as "salary")))) AS xml_spalte FROM scott.dept d LEFT OUTER JOIN scott.emp e USING (deptno) GROUP BY deptno, d.dname; XML-Sichten XML-Sichten mit XQuery sql> xquery for $dept in ora:view("dept")/ROW return <department id="{$dept/DEPTNO}"> <name>{$dept/DNAME/text()}</name> {for $emp in ora:view("emp")/ROW where $emp/DEPTNO = $dept/DEPTNO return <employee id="{$emp/EMPNO}"> <ename>{$emp/ENAME/text()} </ename> <salary>{$emp/SAL}</salary> </employee>} </department> XML-Sichten auch mit Stylesheet http://server:port/oradb/<db-user>/<table_name>/ROW ?transform=/oradb/<db-user>/<stylesheet table>/... &contenttype=text/html... Exkurs: Weitere Funktionen "Original und Fälschung" ... für XML • 1. Dokument ... <vortrag xmlns xmlns= =„bookstore" titel= titel="Oracle XML DB"/> DB"/> • 2. Dokument ... <s:vortrag xmlns:s xmlns:s= =„bookstore" titel= titel="Oracle XML DB"> DB"> </s:vortrag> Welche Unterschiede gibt es zwischen diesen Dokumenten ...? Deltas erkennen ... aber wie? • XML: Das Gleiche unterschiedlich aussagen ... • • • • Namespace-Präfix XML-Tags ohne Inhalt Whitespace Entity-Referenzen <vortrag xmlns= xmlns=„bookstore"/> „bookstore"/> <vortrag></vortrag> xmlns:s= <s:vortrag xmlns:s="oracle"oracle-sig"/> sig"/> <vortrag> </vortrag> <vortrag/> <vortrag>&quot; &quot;</vortrag> <vortrag> &quot;</vortrag> <vortrag> </vortrag> <vortrag>" <vortrag> "</vortrag> • Einfacher Textvergleich greift zu kurz! Deltas erkennen mit SQL • SQL-Funktionen XMLDiff und XMLPatch • Deltas erkennen (XMLDiff) ... ... und auf andere Dokumente anwenden (XMLPatch) • Deltas zwischen Systemen übertragen ... ... mit Rücksicht auf XML-Besonderheiten! <xd:xdiff xsi:schemaLocation="http://xmlns.oracle.com/xdb/xdiff.xsd http://xmlns.oracle.com/xdb/xdiff.xsd" xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <?oracle-xmldiff operations-in-docorder="true" outputmodel="snapshot" diff-algorithm="global"?> <xd:delete-node xd:node-type="text" xd:xpath="/email[1]/body[1]/text()[1]"/> </xd:xdiff> XML Features - Zusammenfassung • • • • • • • • XMLTYPE Datentyp XML Schema Support XML SQL Duality XPath und XQuery DOM Fidelity Web Services XML Index ... Weitere Informationen • Oracle XML DB Developer's Guide 11g: http://docs.oracle.com/cd/E11882_01/appdev.112/ e23094/toc.htm • OTN http://www.oracle.com/technetwork/database/feat ures/xmldb/index-093086.html