Datenbanken 16. Übung XML (eXTensible Markup Language) ist eine standardisierte Syntax zur Beschreiubung von hierarchischen Daten. XML ist keine Programmiersprache sondern ein universelles Format für strukturierte Dokumente und Daten. Die Tag-basierte Syntax ähnelt der von HTML (Hypertext Markup Language). Während HTML einem Web-Browser vorgibt, wie die Daten anzuzeigen sind, teilt XML den Applikationen mit, was die Daten bedeuten. XML eignet sich zur Lösung von Austauschproblemen zwischen heterogenen Systemen. XML und die dazugehörigen Toolkits werden stetig weiterentwickelt 1. Aufgabe: XML und Oracle9i bzw. Oracle 10g JDBC-Applikation Browser SQL-NetZugriff Externe Tools HTTP ftp, WebDAV Oracle 10g Datenbank XML - DB XML – Repository XMLType - Tabellen Abb.: XML-DB Lösungsschritte: Folgende Komponenten in Oracle9i bieten XML-Unterstützung, oder sind speziell für XML entwickelt worden: • Speichern von XML-Daten in einer Tabelle vom Typ XMLType • XML Dokumente als Daten speichern • XML Dokumente als Dokumente speichern • XML Parser und XSL Processors (Java, C, C++, PL/SQL) • XML Class Generator (Java, C++) • XML SQL Utilities für Java • XSQL Servlet • XML Transviewer Beans • XDK-Tools (Software-Devoloper-Kits) • iFS (Internet File System) • Oracle9i und interMedia 1 Aktuelle Informationen unter http://www.w3.org 1 Datenbanken 1. Speichern von XML-Daten in einer Tabellenspalte vom Typ XMLType XML-Datentyp Mit der Einführung des neuen XML-spezifischen Datentyps XMLType machte Oracle einen großen Schritt in Richtung einer echten XML-Integration. Der neue Datentyp kann wie die bisher vorhandenen Datentypen verwendet werden, also z.B. als Datentyp für eine Tabellenspalte oder in Prozeduren der von Oracle entwickelten Scriptsprache PL/SQL. XMLType werwendet die eingebauten XML Parser und den XML Prozessor. Mit XMLType kann man XML-Daten in der Datenbank speichern und abfragen. XMLType besitzt Member-Funktionen für den Zugriff, das Extrahieren und Abfragen von XML-Daten mit einer Klasse von Operationen, die man XPath-Ausdrücke nennt. XMLType ist ein Datentyp in der Oracle-Datenbank wird im nativen Datenbankformat gespeichert ist über alle Oracle-Schnittstellen mit SQL-Zugriff zugänglich und wird folgendermaßen gespeichert als CLOB oder Objekt-relational in Tabellen und Views Bsp.: Tabelle mit dem XMLType-Datentyp -- Anlegen der Tabelle create table my_xml_table ( schluessel NUMBER, xml_column SYS.XMLTYPE ); -- Anzeigen der Spalten mit desc desc my_xml_table -- Erhöhen der Beschreibungstiefe -- fuehrt zur Sichtbarmachung der Member-Funktionen -- für die XMLType-Spalte set describe depth 5 desc my_xml_table Name Null? ----------------------------------------- -------SCHLUESSEL XML_COLUMN Typ ----------------------NUMBER SYS.XMLTYPE METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------XMLDATA CLOB IN METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------XMLDATA VARCHAR2 IN METHOD -----MEMBER FUNCTION EXTRACT RETURNS XMLTYPE Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------XPATH VARCHAR2 IN 2 Datenbanken METHOD -----MEMBER FUNCTION EXISTSNODE RETURNS NUMBER Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------XPATH VARCHAR2 IN METHOD -----MEMBER FUNCTION ISFRAGMENT RETURNS NUMBER METHOD -----MEMBER FUNCTION GETCLOBVAL RETURNS CLOB METHOD -----MEMBER FUNCTION GETBLOBVAL RETURNS BLOB Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------CSID NUMBER IN METHOD -----MEMBER FUNCTION GETSTRINGVAL RETURNS VARCHAR2 METHOD -----MEMBER FUNCTION GETNUMBERVAL RETURNS NUMBER METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA CLOB SCHEMA VARCHAR2 VALIDATED NUMBER WELLFORMED NUMBER In/Out -----IN IN IN IN Defaultwert? -------- METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA BLOB CSID NUMBER SCHEMA VARCHAR2 VALIDATED NUMBER WELLFORMED NUMBER In/Out -----IN IN IN IN IN Defaultwert? -------- METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA BINARY FILE LOB CSID NUMBER SCHEMA VARCHAR2 VALIDATED NUMBER WELLFORMED NUMBER In/Out -----IN IN IN IN IN Defaultwert? -------- METHOD 3 DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT Datenbanken -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA VARCHAR2 SCHEMA VARCHAR2 VALIDATED NUMBER WELLFORMED NUMBER In/Out -----IN IN IN IN Defaultwert? -------- METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA UNDEFINED SCHEMA VARCHAR2 ELEMENT VARCHAR2 VALIDATED NUMBER In/Out -----IN IN IN IN Defaultwert? -------- METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA REF CURSOR SCHEMA VARCHAR2 ELEMENT VARCHAR2 VALIDATED NUMBER In/Out -----IN IN IN IN Defaultwert? -------- METHOD -----STATIC FUNCTION CREATEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XMLDATA ANYDATA SCHEMA VARCHAR2 ELEMENT VARCHAR2 VALIDATED NUMBER In/Out -----IN IN IN IN Defaultwert? -------- METHOD -----MEMBER FUNCTION EXTRACT RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XPATH VARCHAR2 NSMAP VARCHAR2 In/Out Defaultwert? ------ -------IN IN METHOD -----MEMBER FUNCTION EXISTSNODE RETURNS NUMBER Argument Name Typ ------------------------------ ----------------------XPATH VARCHAR2 NSMAP VARCHAR2 In/Out Defaultwert? ------ -------IN IN METHOD -----MEMBER FUNCTION TRANSFORM RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XSL XMLTYPE PARAMMAP VARCHAR2 In/Out Defaultwert? ------ -------IN IN DEFAULT 4 DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT Datenbanken METHOD -----MEMBER PROCEDURE TOOBJECT Argument Name -----------------------------OBJECT SCHEMA ELEMENT Typ ----------------------UNDEFINED VARCHAR2 VARCHAR2 In/Out -----OUT IN IN Defaultwert? -------DEFAULT DEFAULT METHOD -----MEMBER FUNCTION ISSCHEMABASED RETURNS NUMBER METHOD -----MEMBER FUNCTION GETSCHEMAURL RETURNS VARCHAR2 METHOD -----MEMBER FUNCTION GETROOTELEMENT RETURNS VARCHAR2 METHOD -----MEMBER FUNCTION CREATESCHEMABASEDXML RETURNS XMLTYPE Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------SCHEMA VARCHAR2 IN DEFAULT METHOD -----MEMBER FUNCTION CREATENONSCHEMABASEDXML RETURNS XMLTYPE METHOD -----MEMBER FUNCTION GETNAMESPACE RETURNS VARCHAR2 MEMBER PROCEDURE SCHEMAVALIDATE METHOD -----MEMBER FUNCTION ISSCHEMAVALIDATED RETURNS NUMBER METHOD -----MEMBER PROCEDURE SETSCHEMAVALIDATED Argument Name Typ In/Out Defaultwert? ------------------------------ ----------------------- ------ -------FLAG UNDEFINED IN DEFAULT METHOD -----MEMBER FUNCTION ISSCHEMAVALID RETURNS NUMBER Argument Name Typ ------------------------------ ----------------------SCHURL VARCHAR2 ELEM VARCHAR2 In/Out -----IN IN METHOD -----MEMBER FUNCTION INSERTXMLBEFORE RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XPATH VARCHAR2 VALUE_EXPR XMLTYPE In/Out Defaultwert? ------ -------IN IN 5 Defaultwert? -------DEFAULT DEFAULT Datenbanken NAMESPACE VARCHAR2 IN RETURNS XMLTYPE Typ ----------------------VARCHAR2 XMLTYPE VARCHAR2 In/Out Defaultwert? ------ -------IN IN IN DEFAULT METHOD -----MEMBER FUNCTION DELETEXML RETURNS XMLTYPE Argument Name Typ ------------------------------ ----------------------XPATH VARCHAR2 NAMESPACE VARCHAR2 In/Out Defaultwert? ------ -------IN IN DEFAULT METHOD -----MEMBER FUNCTION APPENDCHILDXML Argument Name -----------------------------XPATH VALUE_EXPR NAMESPACE METHOD -----FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA CLOB IN SCHEMA VARCHAR2 IN VALIDATED NUMBER IN WELLFORMED NUMBER IN METHOD -----FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA BLOB IN CSID NUMBER IN SCHEMA VARCHAR2 IN VALIDATED NUMBER IN WELLFORMED NUMBER IN METHOD -----FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA BINARY FILE LOB IN CSID NUMBER IN SCHEMA VARCHAR2 IN VALIDATED NUMBER IN WELLFORMED NUMBER IN METHOD -----FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA VARCHAR2 IN SCHEMA VARCHAR2 IN VALIDATED NUMBER IN WELLFORMED NUMBER IN METHOD -----6 DEFAULT Defaultwert? -------DEFAULT DEFAULT DEFAULT Defaultwert? -------DEFAULT DEFAULT DEFAULT Defaultwert? -------DEFAULT DEFAULT DEFAULT Defaultwert? -------DEFAULT DEFAULT DEFAULT Datenbanken FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA UNDEFINED IN SCHEMA VARCHAR2 IN ELEMENT VARCHAR2 IN VALIDATED NUMBER IN METHOD -----FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA ANYDATA IN SCHEMA VARCHAR2 IN ELEMENT VARCHAR2 IN VALIDATED NUMBER IN METHOD -----FINAL CONSTRUCTOR FUNCTION XMLTYPE RETURNS SELF AS RESULT Argument Name Typ In/Out ------------------------------ ----------------------- -----XMLDATA REF CURSOR IN SCHEMA VARCHAR2 IN ELEMENT VARCHAR2 IN VALIDATED NUMBER IN Defaultwert? -------DEFAULT DEFAULT DEFAULT Defaultwert? -------DEFAULT DEFAULT DEFAULT Defaultwert? -------DEFAULT DEFAULT DEFAULT Jetzt können mit der CREATEXML-Methode von XMLType Werte in my_xml_table eingefügt werden: insert into my_xml_table (schluessel,xml_column) values (1,SYS.XMLTYPE.CREATEXML ('<skriptum> <title> Datenbanken </title> <kapitel num = "1 "> <title> Typologie der Datenbanksysteme </title> <text> Erstes Kapitel aus dem Skript Datenbanken von Prof. Sauer </text> </kapitel> </skriptum>') ); Die Daten lassen sich mit der Methode GETCLOBVAL abfragen: select m.xml_column.GETCLOBVAL() as XML_Daten from my_xml_table m where schluessel = 1; XMLType-Funktion getClobVal isFragment getStringVal getNumberVal extract existsNode Beschreibung Gibt den Inhalt von XMLType als CLOB-Value zurück Handelt es sich bei dem Dokument tatsächlich um ein Fragment Ruft einen Zeichenfolgewert aus einem XML-Knoten ab Ruft einen numerischen Wert aus einem XML-Knoten ab Extrahiert einen teil des Dokuments mit einer Xpath-ähnlichen Syntax und gibt einen XMLType zurück Überprüft den Xpath-Ausdruck auf resultierende Knoten Zur Verbesserung der Performance von Abfragen mit dem XMLType-Datentyp können auf Spalten funktionale Indizes angelegt werden: create index xml_index on my_xml_table (xml_column) 7 Datenbanken indextype is ctxsys.context; XMLType und XML-Schema Beim Erstellen des Datentyps XMLType kann angegeben werden, daß - er einem vorregistrierten Schema entspricht er in einem Objekt-relationalen Format mit Hilfe einer Zuordnung gespeichert wird, die im XML-Schema spezifiziert ist und als XML-Schemaobjekt bezeichnet wird. XML-Schemas werden mit Hilfe des DBMS_XMLSCHEMA-Package registriert. 2. Generierung von XML Lösungsmöglichkeiten: Oracle eigene SQL-Funktionen, Oracle-eigene SQL-Funktionen SYS.XMLGEN(), SYS_XMLAGG() legen aus bestehenden objektrelationalen Daten XMLType-Werte an. Falls eine Spalte mit dem XMLType-Datentyp angelegt wird, speichert Oracle die Daten in einem CLOB-Datentyp. SYS_XMLGEN SQL-Funktion fmt SYS_XMLGEN ( expr ) (konvertiert den als Parameter angegebenen Ausdruck als XML-Dokument) Mit Hilfe der Funktion SYS_XMLGEN ist es möglich, einen als Parameter übergebenen Ausdruck in ein XML-Dokument zu transformieren. Der Ausdruck kann ein skalarer Wert, ein Objekttyp oder eine XMLType Instanz sein. Die Transformationen geschieht dabei nach z.T. einfachen Regeln. Skalare Werte werden zu Textknoten, Objekttypen werden zu verschachtelten Elementen. Sie übernimmt auch ein optionales XMLGenFormatType-Objekt zur Definition von Formatierungsoptionen für das Ergebnis. SYS_XMLGEN übernimmt einen Ausdruck, der auf eine bestimmte Zeile und Spalte der Datenbank evaluiert, und liefert eine Instanz des Typs SYS.XMLType mit einem XML-Dokument. Bsp.: Mit Hilfe der SQL-Anweisung select SYS_XMLGEN(name).getStringVal() from angestellte erhält man in Oracle9i ein XML-Dokument mit dem folgenden Aussehen: SYS_XMLGEN(NAME).GETSTRINGVAL() -------------------------------<?xml version="1.0"?> <NAME>Fritz</NAME> Die Speicherung dieses Datentyps erfolgt als CLOB. Für zukünftige Versionen plant Oracle zusätzliche objekt-relationale Speichermöglichkeiten. Die Abfragemöglichkeiten auf dem Datentyp XMLType basieren auf XPath. Mit Funktionen wie existsNode(XPath_zum_Knoten) kann bspw. überprüft werden, ob der mit dem XPath-Ausdruck angegebene Knoten innerhalb des zu durchsuchenden Dokuments existiert. SYS_XMLAGG SQL-Funktion2 fmt SYS_XMLAGG 2 ( expr ) Siehe auch XMLAGG 8 Datenbanken erzeugt ein einziges XML-Dokument aus einer Menge von XMLType-Werten. Dazu werden die XMLFragmente verkettet und zusätzlich ein Top-Level-Tag eingeführt, das standarmäßig ein ROWSET ist. SYS_XMLAGG aggregiert alle XML-Dokumnete oder –Fragmente, die von expr repräsentiert werden und produziert ein einziges XML-Dokument. Sie fügt ein neues einschließendes Element mit dem Namen ROWSET ein. Falls das XML-Dokument anders formatiert werden soll, ist das über fmt zu erreichen, dass eine Instanz des SYS.XMLGenFormatType-Objekts ist. Bsp.: select SYS_XMLAGG(SYS_XMLGEN(name)).getClobVal() from angestellte where name like 'W%'; SYS_XMLAGG(SYS_XMLGEN(NAME)).GETCLOBVAL() -----------------------------------------<?xml version="1.0"?> <ROWSET> <NAME>Werner</NAME> <NAME>Willi</NAME> </ROWSET> DBMS_XMLGEN PL/SQL Paket - DBMS_XMLGEN PL/SQL-Paket generiert XML-Dokumente nach SQL-Abfrage - Dokument in CLOB-Datenfeld - liefert Optionen zum Ändern von Tag-Name für ROWSET, ... - ist in C implementiert und im Datenbank-Kernel implementiert. SQLX-Standard (noch in Entwicklung) (Versuch, die Schnittstelle zwischen SQL und XML zu standardisieren). Oracle bietet eine Auswahl von SQL-Funktionen3: XMLElement(), XML-Forrest(), XMLAgg(), XMLConcat() 3. XPath Ausgangspunkt ist eine Baumstruktur (ähnlich DOM) eines XML-Dokumentss mit 7 Knotenarten (Wuzelelement, Element, Text (#PCDATA), Attribut, Kommentar, Processing Instruction, Namensraumangaben) und 4 Datentypen (Knotenmenge, string, boolean, number). Die Struktur setzt sich aus 3 Bestandteilen zusammen: Pfadausdrücke (zentrales Konzept), logische und mathematische Verrknüpfungen), Funktionsausdrücke. Pfadausdruck: - Schägstrich ’/’ ist Pfadseperator - zerlegt Pfadausdruck in Schritte: /Schritt/Schritt/…/Schritt XML DB Path: Standard zur Navigation durch XML-Dokumnete. existsnode() extractValue() extract() 4. XML-Schema - W3C-Standard zur Festlegung von Inhalt und Struktur von XML-Dokumenten DBMS_XMLSCHEMA 3 Ähnlich den Oracleeigenen Funktionen: SYS_XMLGEN(), SYS_XMLAGG() 9 Datenbanken Die XML-Schmafunktionalität ist über DBMS_XMLSCHEMA verfügbar. DBMS_XMLSCHEMA unterstützt - das Registrieren von Schemas. XML-Scemas können folgendermaßen registriert werden: lokal, sichbar nur für den Eigentümer globla, sichtbar und verwendbar für alle Datenbankbenutzer das Generieren von Schemas das Löschen von Schemas 5. XML-Repository 6. XML Developer’s Kit Oracle bietet XML-Developper-Kit (XDK) an für Java, JavaBeans, C, C++, PL/SQL. XDK (Sammlung von Tools für die Schnittstelle von XML und Oracle DB) besteht aus: - XMLParser XLST Prozessor (unterstützt XSLT 1.0) XML Schema Prozessor XML Class Generator XML SQL Utility (XSU) XSQL Servlet (auf SQL Abfragen aufbauend können XML-Dokumente generiert werden und mit Hilfe von XSLT in beliebige Formate umgewandelt werden Oracle SOAP Einsatzgebiet: Anbindung von XML_Systemen an bestehende Datenbanken mit relational gespeicherten Daten. Der Einsatz kann mit jeder DB erfolgen, für die es JDBC-Treiber gibt. Der Vorteil liegt in der klaren Trennung zwischen XML und SQL (KnowHow-Trennung zwischen XML-Entwickler und DB-Entwickler). XDK-Komponente XML Parser XSLT Prozessor XML Schema Prozessor XML Class Generator XML SQL Utilty XSQL Servlet XML Transviewer Beans TransXUtility Oracle SOAP XML Compressor Java x x x x x x x x x x C++ x x x x C x x x PL/SQL x x x x XML Parser Oracle stellt XML-Parser für verschiedene Programmiersprachen bereit, die auf allen Plattformen angeboten werden, für die Oracle angeboten wird. Die Parser unterstützen DOM (Document Object Model) und SAX (Simple API for XML) und beinhalten ab der Version 2 einen integrierten XSLTProzessor. XML-Parser gibt es für DOM 2.0, SAX 2.0, JAXP 1.1. XML-Parser dienen zur DTD-, XML Schema-Validierung XML-Parser werden aufgerufen über die Java-Klassen DOMParser und SAXParser bzw. über das Kommandozeilentool oraxml. XML-Parser sind Grundlage bzw. Bestandteil der weiteren XDK-Komponeten XML Schema Prozessor - baut auf XML-Parser auf 10 Datenbanken - Aufruf über DOMParser.setSchemaValidationMode() XSLT Prozessor - Formatumwandlung von XML-Dateien mit einer Vielzahl von Zielformaten: http, ASCII, XML, … Aufruf über Java-Klassen XSL-Prozessor oder Kommandozeilentool oraxsl XML Class Generator - Automatische Generierung von Java/C++-Klassen auf der Basis von DTD- oder XMLSchema-Definitionen Aufruf über Java-Klassen SchemaClassGenerator bzw. DTDClassGenerator oder Kommandozeilentoll oracg Auf den XML-Parsern baut ein spezieller XML-Klassengenerator auf, der Javaklassen aus einer XMLDTD erzeugt. Werden diese Java-Klassen benutzt, können Java-Anwendungen XML-Dokumente erstellen, die zur gegebenen DTD passen. Der Klassengenerator arbeitet in Verbindung mit dem Oracle XML-Parser für Java, welcher die DTD parst und das geparste Dokument an dem Klassengenerator übergibt. XML SQL Utility (XSU) ist 1. Das Werkzeug zur Umwandlung der relationalen Daten in XML-Format 2. Das Werkzeug zum stückweisen (piecewice) Update von XML-Dokumenten 3. ein Werkzeug, dessen Funktionalitäten erreichbar sind über: Java API, PL/SQL, Java-Befehl Mit der XML_SQL Utility (XSU) können Ergebnisse einer SQL-Abfrage in XML konvertiert werden. XSU unterstützt das dynamische Generieren von DTDs und das Einfügen von XML in Datenbanken. Mit XSU können auch Zeichen in Datenbankobjekten aktualisiert oder gelöscht werden. Auf XSU greift man über Java und PL/SQL-API zu. Die XSU-Klassen sind Teil der OracleKernelsoftware. Das XML SQL Werkzeug für Java besteht aus Java-Klassen, die z.B. eine Anfrage auf die Datenbank weiterleiten und ein XML-Dokument (Text oder DOM) aus den Ergebnissen generieren, oder XMLDaten in eine Datenbank schreiben. Durch eine zusätzliche Funktionalität des XML SQL Utility ist es ebenso möglich, eine DTD zu generieren, die auf dem Schema einer Tabelle basiert. Diese DTD kann als Eingabe für den XML Klassengenerator benutzt werden. Da ein PL/SQL-API verfügbar ist, kann man direkt mit SQL auf die XSU-Funktionalitäten zugreifen. So kann bspw. Die XML-Version der Tabelle „angestellte“ über die XSU PL/SQL-Prozeduren generiert werden: set serveroutput on DECLARE queryCtx DBMS_XMLQuery.ctxType; result CLOB; xmlstr varchar2(32767); -- Variable zur Konvertierung lob nach varchar line varchar2(2000); begin queryCtx := DBMS_XMLQuery.newContext('select * from angestellte'); -- bestimme das Ergebnis result := DBMS_XMLQuery.getXML(queryCtx); -- Das Resultat kann nun in Tabellen aufgenommen werden xmlstr := DBMS_LOB.substr(result,32767); LOOP exit when xmlstr is null; line := substr(xmlstr,1,instr(xmlstr,chr(10))-1); DBMS_OUTPUT.put_line('| ' || line); xmlstr := substr(xmlstr,instr(xmlstr,chr(10))+1); END LOOP; -- Schliessen Query DBMS_XMLQuery.closeContext(QueryCtx); 11 Datenbanken end; / Das Ergebnis ist die „angestellte“-Tabelle, formatiert mit XML-Tags <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <ANG_ID>A1</ANG_ID> <NAME>Fritz</NAME> <GEBDATUM>1/2/1950 0:0:0</GEBDATUM> <ABT_ID>OD</ABT_ID> <JOB_ID>SY</JOB_ID> </ROW> <ROW num="2"> <ANG_ID>A2</ANG_ID> <NAME>Tom</NAME> <GEBDATUM>3/2/1951 0:0:0</GEBDATUM> <ABT_ID>KO</ABT_ID> <JOB_ID>IN</JOB_ID> </ROW> <ROW num="3"> <ANG_ID>A3</ANG_ID> <NAME>Werner</NAME> <GEBDATUM>1/23/1948 0:0:0</GEBDATUM> <ABT_ID>OD</ABT_ID> <JOB_ID>PR</JOB_ID> </ROW> <ROW num="4"> <ANG_ID>A4</ANG_ID> <NAME>Gerd</NAME> <GEBDATUM>11/3/1955 0:0:0</GEBDATUM> <ABT_ID>VT</ABT_ID> <JOB_ID>KA</JOB_ID> </ROW> <ROW num="5"> <ANG_ID>A5</ANG_ID> <NAME>Emil</NAME> <GEBDATUM>3/2/1960 0:0:0</GEBDATUM> <ABT_ID>PA</ABT_ID> <JOB_ID>PR</JOB_ID> </ROW> <ROW num="6"> <ANG_ID>A6</ANG_ID> <NAME>Uwe</NAME> <GEBDATUM>4/3/1952 0:0:0</GEBDATUM> <ABT_ID>RZ</ABT_ID> <JOB_ID>OP</JOB_ID> </ROW> <ROW num="7"> <ANG_ID>A7</ANG_ID> <NAME>Erna</NAME> <GEBDATUM>11/17/1955 0:0:0</GEBDATUM> <ABT_ID>KO</ABT_ID> <JOB_ID>TA</JOB_ID> </ROW> <ROW num="8"> <ANG_ID>A8</ANG_ID> <NAME>Rita</NAME> <GEBDATUM>12/2/1957 0:0:0</GEBDATUM> <ABT_ID>KO</ABT_ID> <JOB_ID>TA</JOB_ID> </ROW> 12 Datenbanken <ROW num="9"> <ANG_ID>A9</ANG_ID> <NAME>Ute</NAME> <GEBDATUM>8/8/1962 0:0:0</GEBDATUM> <ABT_ID>OD</ABT_ID> <JOB_ID>SY</JOB_ID> </ROW> <ROW num="10"> <ANG_ID>A10</ANG_ID> <NAME>Willi</NAME> <GEBDATUM>7/7/1956 0:0:0</GEBDATUM> <ABT_ID>KO</ABT_ID> <JOB_ID>IN</JOB_ID> </ROW> <ROW num="11"> <ANG_ID>A12</ANG_ID> <NAME>Anton</NAME> <GEBDATUM>7/5/1948 0:0:0</GEBDATUM> <ABT_ID>OD</ABT_ID> <JOB_ID>SY</JOB_ID> </ROW> <ROW num="12"> <ANG_ID>A13</ANG_ID> <NAME>Josef</NAME> <GEBDATUM>8/2/1952 0:0:0</GEBDATUM> <ABT_ID>KO</ABT_ID> <JOB_ID>SY</JOB_ID> </ROW> <ROW num="13"> <ANG_ID>A14</ANG_ID> <NAME>Maria</NAME> <GEBDATUM>9/17/1964 0:0:0</GEBDATUM> <ABT_ID>PA</ABT_ID> <JOB_ID>KA</JOB_ID> </ROW> </ROWSET> Zum Einfügen eines Dokuments in eine Tabelle oder View dient das DBMS_XMLSave-Package. XSU parst das Dokument und legt eine insert-Anweisung an, die Werte in alle Spalten oder View einfügt. Ein fehlendes Element wird als NULL-Wert behandelt. Man kann auch die XSU DML-Operationen über Aufrufe an Java-Klassen ausführen. Zur Ausführung kommt dann die oracle.xml.sql.query.OracleXMLQuery-Klasse. Anstatt des DBMS_XMLSavePackage wird oracle.xml.sql.dml.OracleXMLSave verwendet. XSQL-Servlet Das XSQL Servlet ist ein Werkzeug, das SQL Abfragen erzeugt und das Ergebnis in XML zurückgibt. Dieser Prozessor ist als Java Servlet implementiert und akzeptiert als Eingabe ein XML-Dokument, das SQL Abfragen enthält. Das XSQL Servlet benutzt sowohl den XML Parser für Java als auch das XML SQL Utility. XSQL ist für direkte Anfragen auf Webseiten entworfen. 13 Datenbanken Web-Server XSQL – Servlet HTTP Client XMLParser XSLT-Prozessor XML-SQL-Utility (XSU) JDBC -Datenbank HTML, XML Stylesheets Abb.: XSQL-Servlet Ausgabngsbasis: XSQL-Page 7. XML Dokumente als Daten speichern Wenn das XML-Dokument eine wohldefinierte Struktur hat und Daten enthält, die geändert werden, ist das Dokument datenorientiert (data-centric). Typischerweise enthalten XML-Dokumente Elemente und Attribute, die eine komplexe Struktur haben (Bsp: Rechnungen, Flugpläne,...). Oracle9i besitzt die Möglichkeit, diese Struktur auszulesen und daraus eine Datenbankstruktur zu erstellen, indem Objekte, Objektreferenzen, usw. benutzt werden. Es gibt zwei Möglichkeiten die XML-Daten in objekt-relationaler Form zu speichern und vorzuhalten: • Die Attribute der Elemente werden in einer Tabelle gespeichert und Objektsichten werden definiert, um die Struktur des XMLDokuments abzubilden. • Die strukturierten XML-Elemente werden in einer Objekt-Tabelle gespeichert. Sind die Daten erst mal in objekt-relationaler Form gespeichert, ist es jederzeit möglich, die Daten zu aktualisieren, abzufragen, zu formatieren oder neu anzuordnen. In diesem Zusammenhang seien die XMLEnabled “Section Searches” in ConText, womit SQL-Abfragen auf strukturierten Daten und indizierten Fragmenten durchgeführt werden können, sowie die Möglichkeit erwähnt, Sichten mit XML und SQL zu kombinieren. 8. XML Dokumente als Dokumente speichern Diese Strategie wird gewählt, wenn das XML-Dokument statischen Inhalt enthält, der nicht geändert wird, es sei denn, daß das komplette Dokument ausgetauscht wird (Bsp: Bücher, Artikel, etc.). Diese Art von Dokumenten wird als dokumentorientiert bezeichnet (document-centric) und sind von einer Datenbank als Ganzes abrufbar. Das Dokument selbst kann in Oracle8i gespeichert und verwaltet werden, es ist aber auch möglich, einen Link zum Objekt außerhalb der Datenbank zu erstellen. 9. Das Internet File System iFS Schon in früheren Versionen des Datenbanksystems von Oracle gab es das iFS, eine JavaAnwendung innerhalb von Oracle9i’s Java Virtual Machine, die Daten der Datenbank in der gleichen Struktur darstellt, wie Daten auf einem Netzlaufwerk. Aus den unterschiedlichsten Anwendungen heraus, kann mit Hilfe der Standardprotokolle HTTP, SMB, SMTP, IMAP4, POP3 und FTP auf die Daten der Datenbank zugegriffen werden. Unter Einsatz eines Webbrowsers können die Daten beispielsweise wie eine Website oder ein FTP-Verzeichnis dargestellt werden, Email-Clients nutzen die Datenbank wie ein anderes Email-System. Die Darstellung der Daten ist in jeder Anwendung dieselbe. Benutzer können die Dateien, die relationalen 14 Datenbanken Daten enthalten, aber auch Hybrid-Dokumente mit relationalen und nicht-relationalen Daten mittels Drag- und Drop-Funktionen aus iFS herausziehen oder direkt in iFS bearbeiten und verändern. Mit iFS können neue Dateitypen definiert werden, die beispielsweise auf XML basieren. Bei dieser Definition wird die Struktur des neuen Dateityps festgelegt und damit auch, wie Dateien dieses Typs in der Datenbank zu speichern sind. Wird nun ein Dokument dieses Typs an iFS gesendet, erkennt das Dateisystem diesen Typ, parst die Datei und speichert die enthaltenen Daten nach der Vorgabe ab. Sind Instanzen eines Dokuments einmal in der Datenbank gespeichert, ist es möglich, den Inhalt mit Standard SQL-Abfragen zu durchsuchen. Auch einer Organisation der Daten mit dem Windows Explorer oder einer Suchanfrage über selbigen steht nichts mehr im Weg. 10. Oracle9i und interMedia Mit interMedia ist es möglich XML-Dokumente, die in Oracle9i gespeichert sind zu durchsuchen. Das XML kann z.B. als “nur”-Text indiziert werden, oder es werden Dokumentenabschnitte in XMLDokumenten für genauere Suchen definiert. Beispiel: “FIND Oracle WITHIN title”, wobei “title” ein Abschnitt im XML-Dokument ist. Auch die objekt-relationalen Eigenschaften von Oracle9i können genutzt werden, um die komplexe Struktur der XML-Daten zu erfassen. Damit ist es möglich, XML Daten auf einer höheren Ebene zu extrahieren, was zu einer schnelleren und effizienteren Konstruktion dynamischer XML Dokumente, die aus diesen extrahierten Fragmenten erstellt werden, führt. Es gibt 4 grundlegende Strategien, um XML Daten in Oracle9i zu speichern: • Das XML-Dokument als einzelnes, voll funktionsfähiges Objekt, mit seinen Tags in einen CLOB oder BLOB zu speichern. • Das XML-Dokument als Daten zu speichern und die Daten ohne Tags auf die relationalen Tabellen zu verteilen. • Speichern von XML-Daten in einer Tabellenspalte vom Typ des in Oralce9i eingeführten Datentyps XMLType. • Kombinationen der ersten drei Strategien. Welche Wahl man zum speichern eines XML-Dokuments trifft, hängt dabei von der zugrunde liegenden Struktur der Datei ab. 15 Datenbanken 7. Oracle XML SQL Utilities 8. XSQL Servlet Apache 1.3.9 mit JServ und Tomcat, Sun JavaServer, Oracle Application Server. 11. XML Transviewer Java Beans Mit den XML Transviewer Java Beans stellt Oracle XML-Komponenten für Java-Anwendungen bereit, mit denen es Entwicklern ermöglicht wird, auf XML basierende Datenbankanwendungen schnell zu entwikkeln. Die zur Verfügung gestellten Beans umfassen das DOM Builder Bean, zum parsen von XMLDokumenten, das XML Source Viewer Bean, für die verbesserte Darstellung von XML- und XSLDateien, das XML Tree Viewer Bean, zur grafischen Darstellung der Baumstruktur von XMLDokumenten, sowie das XSL Transformer Bean, welches die Umwandlung von XML-Dokumenten in fast jedes textbasierte Format, wie XML, HTML, etc. umzuwandeln, indem ein XSL Stylesheet verwendet wird. 10. XDK-Tools (Software-Developper-Kits) 16