xml-unterstützung in oracle. © prof. t. kudraß, htwk leipzig 2 2 Überblick xml architekturformen...
TRANSCRIPT
XML-Unterstützung in Oracle
2<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
2
Überblick
XML Architekturformen und Speicherungsarten
XML Schema und MappingLaden von DatenZugriff
4<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
4
Clob
Relational
Die Speicherart richtetsich nach den Anforderungen der Anwendung:
• Konkurrierender Zugriff• Vokabularänderung• Ladeperformance• Abfrage-Performance• Redundanzen• XML Schema Support
Unterschiedliche Speicherarten in Oracle
Nativ alsDokument
NativObjektrelational
5<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
5
XML Werkzeuge relational / CLOB XSQL Servlet XML SQL Utility
XML Werkzeuge relational / CLOB XSQL Servlet XML SQL Utility
XML Datentyp dokumentbasiert XPath Zugriffe Indizes
XML Werkzeuge relational / CLOB XSQL Servlet XML SQL Utility
XML Datentyp dokumentbasiert XPath Zugriffe Indizes
Objektrelational XML Schema Zugriffe mit
WebDAV, DOM
Geschichte
XML Werkzeuge relational / CLOB XSQL Servlet XML SQL Utility
XML Datentyp dokumentbasiert XPath Zugriffe Indizes
Objektrelational XML Schema Zugriffe mit
WebDAV, DOM
SQL/XML XQuery
Oracle8i Oracle9i Oracle10g
Release1 Release2
Entwicklung der XML-Features von Oracle
6<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
6
Oracle und XML Schema
Typen
Tabellen
Java Beans
Security
generiert
SQL DataSQL Data
Schema
in der Datenbank
8<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
8
Terminologie: "annotated" XML Schema
XML Schema mit "Zusatzinformationen" Herstellerspezifische Tags und Attribute zur Steuerung
der Persistenz Namespace-Konzept Bei der Schema-Prüfung ignoriert der Parser gemäß
W3C alle Namespaces, die er nicht kennt"– Datenbankunabhängige Parser beachten nur das allgemeine
XML Schema– Bei Registrieren in der Datenbank wird nur das allgemeine
XML Schema und die eigenen "Annotations " berücksichtigt.
11
© Prof. T. Kudraß, HTWK Leipzig
11
Schema-Registrierung
EXECUTE dbms_xmlschema.registerschema ('http://www.personal.xyz/Personal.xsd‘,-- schemaURL IN varchar2 getFileContent(bfilename('XML_DIR',Personal.xsd')),TRUE, --local IN BOOLEANTRUE, --genTypes IN BOOLEAN := TRUEFALSE, --genbean IN BOOLEAN := FALSETRUE, --genTables IN BOOLEAN := TRUEFALSE, --force IN BOOLEAN := FALSE'XMLUSER' --owner IN VARCHAR2 := '');
EXECUTE dbms_xmlschema.registerschema ('http://www.personal.xyz/Personal.xsd‘,-- schemaURL IN varchar2 getFileContent(bfilename('XML_DIR',Personal.xsd')),TRUE, --local IN BOOLEANTRUE, --genTypes IN BOOLEAN := TRUEFALSE, --genbean IN BOOLEAN := FALSETRUE, --genTables IN BOOLEAN := TRUEFALSE, --force IN BOOLEAN := FALSE'XMLUSER' --owner IN VARCHAR2 := '');
Parameter: Schema-Name bzw. Schema-URL Schema-Quelle als Instanz von XMLType, CLOB, VARCHAR2 oder URI Flags zur Steuerung der Generierung von DB-Objekten (Tabellen, Types)
12
© Prof. T. Kudraß, HTWK Leipzig
12
Der Datentyp XMLType
Ablage als CLOB
CREATE TABLE letter OF XMLTYPE;-- STORE AS CLOB erzwingt Speicherung als CLOB
CREATE TABLE letter OF XMLTYPE;-- STORE AS CLOB erzwingt Speicherung als CLOB
Ablage als XML Schemabasierenden Tabelle
CREATE TABLE emp_tab2 OF XMLTYPE XMLSCHEMA "http://xmluser.de.oracle.com/xsd/deptemp.xsd" ELEMENT "emptable";
CREATE TABLE emp_tab2 OF XMLTYPE XMLSCHEMA "http://xmluser.de.oracle.com/xsd/deptemp.xsd" ELEMENT "emptable";
Ablage als XML Schemabasierende Spalte
CREATE TABLE dept_tab2 (deptno NUMBER, employee XMLTYPE)XMLTYPE employee STORE AS OBJECT RELATIONALXMLSCHEMA "http://xmluser.de.oracle.com/xsd/deptemp.xsd" ELEMENT "emptable";
CREATE TABLE dept_tab2 (deptno NUMBER, employee XMLTYPE)XMLTYPE employee STORE AS OBJECT RELATIONALXMLSCHEMA "http://xmluser.de.oracle.com/xsd/deptemp.xsd" ELEMENT "emptable";
14<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
14
Laden von XML-Daten in die Datenbank
Mit SQL, PL/SQL und Java– INSERT INTO .. VALUES …– als CLOB – Oracle Text– zusätzliche Indexierung erforderlich
Mit Hilfe von Protokollen: – FTP – WEBDAV– HTTP
15<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
15
Arbeit mit CLOBs (PL/SQL)
declare theClob CLOB; theBFile BFILE;begin insert into xmldocs(filename,document) values (‘Sample.xml‘, empty_clob()) returning document into theClob; theBFile:=BFileName(‘XMLFILES‘,‘Sample.xml‘); dbms_lob.fileOpen (theBFile); dbms_lob.loadFromFile (dest_lob=>theClob,
src=>theBFile,amount=>dbms_lob.getLength(theBFile));
dbms_lob.fileClose(theBFile); commit;end;
Speicherung von XML Files mittels DBMS_LOB Package
BFILE mit Source File assoziiert, Logical Directory Object XMLFILES vorher in Datenbank anlegen, z.B.>CREATE DIRECTORY xmlfiles as ‘c:\work‘
16<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
16
Indizieren XML mit interMedia Text
Voraussetzung für tag-basierte Queries: Index auf den Anfragespalten
in SQL: CREATE INDEX erweitern um Klausel INDEXTYPE IS ctxsys.context
– erlaubt CONTAINS in WHERE-Klausel Sectioner: Sammlung von XML-Tags, die indiziert
werden sollen– repräsentiert durch section group im CREATE INDEX-
Befehl / PARAMETERS Klausel– erlauben inhaltsbasiertes Retrieval, beschränkt auf spezifische
XML-Tags vordefinierte (für jedes Tag) vs. benutzerdefinierte
Sectioner
17<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
17
Beispiel: Arbeit mit interMedia Text (1)
CREATE TABLE ins_claim(id NUMBER(7) PRIMARY KEY, when DATE, doc CLOB);
Speicherung von XML-Dokumenten einer Versicherungsgesellschaft
Spalte doc ist indiziert mit auto_section_group:
CREATE INDEX doc_ix ON ins_claim(doc)INDEXTYPE IS ctxsys.contextPARAMETERS (‘section group ctxsys.auto_section_group‘);
18<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
18
Beispiel: Arbeit mit interMedia Text (2)
The insured‘s <VEHICLE>car</VEHICLE>broke through the guard rail and plummeted into a ravine. The cause was determined to be <CAUSE>faulty braked</CAUSE> Amazingly there were no casualties.
Beispiel-Dokument in der Spalte doc:
XML Section <cause> kann abgefragt werden:
SELECT id, whenFROM ins_claimWHERE contains (doc,‘brakes WITHIN cause‘) > 0;
ID WHEN DOC------- ------ -------1 12-OCT-00 The insured‘s <VEHICLE>car...
19<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
19
Beispiel: Arbeit mit interMedia Text (3)
ctx_ddl.create_section_group(‘my_section‘, ‘XML_SECTION_GROUP‘);
ctx_ddl.add_zone_section(‘my_section‘,‘cause‘,‘Cause‘);...ctx_ddl.add_attr_section(‘my_section‘,‘make‘,‘Make@Vehicle‘);...CREATE INDEX my_doc_ix ON ins_claim(doc)INDEXTYPE IS ctxsys.contextPARAMETERS(‘section group my_section‘);
Alternative zu vordefiniertem Auto-Sectioner:Definition eines eigenen Sectioners und Verwendung im Index
Mögliche Abfrage ist Suche nach Attributwerten: ... where contains (doc, ‘Audi within Make@Vehicle‘)Findet: <Vehicle Make=“Audi“>
section name tag name
20
© Prof. T. Kudraß, HTWK Leipzig
20
Laden von Daten über INSERT
SQL> INSERT INTO Personalakten VALUES 2 (XMLTYPE(' 3 <? xmlversion="1.0"?> 4 <Personalakte Personalnummer="2234"> 5 <Personalien> 6 <Nachname>Meier</Nachname> 7 <Vorname>Otto></Vorname> 8 <Geburtsdatum>1.1.1970</Geburtsdatum> 9 </Personalien> 10 <Gehaltsdaten Steuerklasse="1" 11 Kirchensteuer="RK" Kinder="0" /> 12 <Zeugnisse/> 13 </Personalakte> 14 '));
1 row created.
SQL> INSERT INTO Personalakten VALUES 2 (XMLTYPE(' 3 <? xmlversion="1.0"?> 4 <Personalakte Personalnummer="2234"> 5 <Personalien> 6 <Nachname>Meier</Nachname> 7 <Vorname>Otto></Vorname> 8 <Geburtsdatum>1.1.1970</Geburtsdatum> 9 </Personalien> 10 <Gehaltsdaten Steuerklasse="1" 11 Kirchensteuer="RK" Kinder="0" /> 12 <Zeugnisse/> 13 </Personalakte> 14 '));
1 row created.
mittels XMLType-Konstruktor
21<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
21
Laden über Internet Protokolle
23<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
23
Sichtweise auf das Repository
TableName ACL
Property 1
Property N
Property N
XML TableB TreeIndex
TextIndex
HierarchicalIndex
resource_view
FTP
HTTP
xdb$resource
24<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
24
XML Zugriff mit SQL
Schnittstellen– JDBC– ODBC– native OCI– XQuery– SQL/XML
Nutzung von Datenbankfeatures– relationale Tabellen– objektrelationaler Zugriff– gespeicherte Prozeduren und Funktionen– Kombination mit AQ (Advanced Queues)
25<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
25
Funktionen auf XMLType
Zugriff auf den Inhalt eines Objekts von XMLType über Funktionen:
– extract um das Ergebnis eines XPath-Ausdrucks zu erhalten,– getClobVal, getStringVal und getNumVal, um das Ergebnis
von extract in einen SQL-Datentyp zu überführen,– extractValue, um das Ergebnis eines XPath-Ausdrucks direkt
in einen SQL-Wert umzuwandeln,– existsNode, um zu prüfen, ob ein XPath-Ausdruck ein
Ergebnis liefert.– createXML erzeugt aus einer SQL-Zeichenkette einen Wert
des Typs XML (bei inhaltsorientierter Zerlegung wieder auf SQL-Tabellen abgebildet)
26
© Prof. T. Kudraß, HTWK Leipzig
26
Funktionen auf XMLType - Beispiele
Anzahl der Kinder des Angestellten Meier als numerischer Wert
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal()AS Kinderzahl
FROM Personalakten PWHERE P.Personalakte.extract(‘//Personalien/Nachname/text()‘).
getstringVal() = ‘Meier‘;
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal()AS Kinderzahl
FROM Personalakten PWHERE P.Personalakte.extract(‘//Personalien/Nachname/text()‘).
getstringVal() = ‘Meier‘;
gleiche Anfrage unter Verwendung eines XPath-Ausdrucks in WHERE-Klausel
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal()AS Kinderzahl
FROM Personalakten PWHERE P.Personalakte.existsNode(‘//Personalien[Nachname="Meier"]‘);
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal()AS Kinderzahl
FROM Personalakten PWHERE P.Personalakte.existsNode(‘//Personalien[Nachname="Meier"]‘);
27
© Prof. T. Kudraß, HTWK Leipzig
27
Funktionen auf XMLType – Beispiele (2)
extract liefert Markup mit extractValue() entspricht extract.text() Erweiterung von XPath durch Oracle durch weitere Funktionen, z.B. ora:contains
– vergleichbar mit CONTAINS-Operator in SQL– aber: kein Textindex erforderlich
SELECT P.Personalakte.extractValue('//Nachname') AS NachnameFROM Personalakten PWHERE P.Personalakte.existsNode( ‘//Zeugnis[ora:contains(Zwischenzeugnis,"vollen" OR "vollsten")>0]‘);
SELECT P.Personalakte.extractValue('//Nachname') AS NachnameFROM Personalakten PWHERE P.Personalakte.existsNode( ‘//Zeugnis[ora:contains(Zwischenzeugnis,"vollen" OR "vollsten")>0]‘);
28
© Prof. T. Kudraß, HTWK Leipzig
28
Änderungen von XML-Dokumenten
UPDATE Personalakten p SET p.Personalakte = createXML (' <?xml version="1.0"?> <Personalakte Personalnummer="2234"> <Personalien> <Nachname>Meier>/Nachname> <Vorname>Otto></Vorname> <Geburtsdatum>1970-01-01</Geburtsdatum> </Personalien> <Gehaltsdaten Steuerklasse="1" Kirchensteuer="RK" Kinder="0" /> <Zeugnisse/> </Personalakte> ')
WHERE p.Personalakte.extractValue('/Personalakte/@Personalnummer' ) = 2234;
UPDATE Personalakten p SET p.Personalakte = createXML (' <?xml version="1.0"?> <Personalakte Personalnummer="2234"> <Personalien> <Nachname>Meier>/Nachname> <Vorname>Otto></Vorname> <Geburtsdatum>1970-01-01</Geburtsdatum> </Personalien> <Gehaltsdaten Steuerklasse="1" Kirchensteuer="RK" Kinder="0" /> <Zeugnisse/> </Personalakte> ')
WHERE p.Personalakte.extractValue('/Personalakte/@Personalnummer' ) = 2234;
Variante 1: ganzes Dokument angeben, um XMLType-Spalte zu ersetzen
29
© Prof. T. Kudraß, HTWK Leipzig
29
Änderungen von XML-Dokumenten
UPDATE Personalakten p SET p.Personalakte = UpdateXML (p.Personalakte, ‘/Personalakte/Personalien/Nachname/text()‘, ‘Schulz‘,
‘/Personalakte/Gehaltsdaten/@Steuerklasse‘, ‘3‘)WHERE p.Personalakte.extractValue(‘/Personalakte/@Personalnummer‘)
= 2234;
UPDATE Personalakten p SET p.Personalakte = UpdateXML (p.Personalakte, ‘/Personalakte/Personalien/Nachname/text()‘, ‘Schulz‘,
‘/Personalakte/Gehaltsdaten/@Steuerklasse‘, ‘3‘)WHERE p.Personalakte.extractValue(‘/Personalakte/@Personalnummer‘)
= 2234;
Variante 2: Update nur für die zu ändernden Teile beschreiben
Beispiel beschreibt Änderungen während einer Heirat Funktion UpdateXML kann mehrere XPath-Ausdrücke
verarbeiten neuer Wert kann selbst auch vom Typ XMLType sein
30<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
30
SQL/XML in Oracle Oracle unterstützt SQL/XML-Funktionen aus dem
Standard– XMLELEMENT
ohne Keyword NAME auch Werte von SQL-Objekttypen erlaubt (row types)
– XMLCONCAT– XMLAGG
Gegenüber Standard erweiterte Funktionen: – XMLSEQUENCE
liefert ein VARRAY von XMLType-Instanzen (daraus lässt sich mittels TABLE-Funktion Tabelle konstruieren)
liefert dabei alle Elemente auf der höchsten Ebene zurück macht Konkatenation rückgängig, die durch Funktion extract
verursacht wird. – XMLCOLLATTVAL
erzeugt für jede Spalte ein Element des festen Namens column
31<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
31
SQL/XML in Oracle (Beispiel)
<Personalakte Personalnummer="2234"> <Personalien> <Nachname>Müller>/Nachname> <Vorname>Otto></Vorname> <Geburtsdatum>1960-01-01</Geburtsdatum> </Personalien> <Gehaltsdaten Steuerklasse="3"
Kirchensteuer="RK" Kinder="3"> <Gehalt Start="1997-01-01" >7500</Gehalt> <Gehalt Start="1999-01-01" >8000</Gehalt> <Gehalt Start="2001-01-01" >8500</Gehalt>
</Gehaltsdaten></Personalakte>
<Personalakte Personalnummer="2234"> <Personalien> <Nachname>Müller>/Nachname> <Vorname>Otto></Vorname> <Geburtsdatum>1960-01-01</Geburtsdatum> </Personalien> <Gehaltsdaten Steuerklasse="3"
Kirchensteuer="RK" Kinder="3"> <Gehalt Start="1997-01-01" >7500</Gehalt> <Gehalt Start="1999-01-01" >8000</Gehalt> <Gehalt Start="2001-01-01" >8500</Gehalt>
</Gehaltsdaten></Personalakte>
Ermittle alle Gehaltselemente, die einen Wert von mindestens 8000 beinhalten
SELECT value(g).getClobValFROM PersonalaktenX p,
TABLE(XMLSequence(extract(value(p),‘//Gehalt‘))) g WHERE extractValue(value(g), ‘/Gehalt‘) >= 8000;
SELECT value(g).getClobValFROM PersonalaktenX p,
TABLE(XMLSequence(extract(value(p),‘//Gehalt‘))) g WHERE extractValue(value(g), ‘/Gehalt‘) >= 8000;
32<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
32
XQuery-Unterstützung in Oracle drei Funktionen, die XQuery unterstützen
– XMLQuery– XMLTable– XQuery (seit 10R2)
einige Bestandteile des XQuery-Standards in früheren Oracle-Versionen nicht verfügbar
Funktion ora:view– zur Anbindung von Tabellen an XQuery– erzeugt eine XML-Struktur von Tabellen (SQL/XML konform)
Beispiel
xqueryfor $i in ora:view("Auftrag")return <Auftraggeber>{$i/Firma}</Auftraggeber>
xqueryfor $i in ora:view("Auftrag")return <Auftraggeber>{$i/Firma}</Auftraggeber>
Weitere Details im XQuery-Tutorial im Internet: http://xquery-tutorial.de.vu
33<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
33
Das XML SQL Utility (XSU) Prinzip:
– Generierung von XML-Dokumenten aus SQL-Abfragen (in String-Darstellung oder DOM)
– Speichern von XML-Dokumenten durch Einfügen von Daten aus Dokumenten (“generated“ XML)
– Aktualisieren und Löschen von Daten aus XML-Dokumenten in der Datenbank
Schnittstellen:– XSU Java API– XSU PL/SQL API (Packages DBMS_XMLQuery und
DBMS_XMLSave)– Kommandozeilen-Interface
Verwendung der XSU- Funktionen durch Aufruf der Java-Klasse OracleXML
Aufruf in Kommandozeile:java OracleXML [putXML | getXML] optionen
34<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
34
XSU-Umgebung
JDBC Driver
XML Parser
Applikation
XSU
XML-Dokument Oracle-Datenbank
XSU kann installiert werden:
• auf Client-Seite (nur für Java)
• in der Datenbank (erfordert Jserver)
• in der Middle Tier (Web oder Application Server u.a. Oracle Tools
35<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
35
Aufruf von XSU: getXML
C:\work\Oracle\XSU12\lib>java OracleXML getXML -user “xuser/xuser“ “select * from dept“
<?xml version=‘1.0‘?><ROWSET> <ROW num=“1“> <DEPTNO>10</DEPTNO> <DNAME>ACCOUNTING</DNAME> <LOC>NEW YORK</LOC> </ROW> <ROW num=“2“> <DEPTNO>20</DEPTNO> <DNAME>RESEARCH</DNAME> <LOC>DALLAS</LOC> </ROW> ...</ROWSET>
36<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
36
Aufruf von XSU: putXML
Anmerkungen: Insert-Operationen erfordern kanonisches XML-
Format – Format muß der Ausgabe der XSU entsprechen
(einschließlich <rowset> und <row> Tags)
Kommandozeilen-Interface erlaubt keine Update- und Delete-Operationen, d.h. nur über API möglich
C:\work\Oracle\XSU12\lib>java OracleXML putXML -user “xuser/xuser“ –fileName sampdoc.xml xmltab
Successfully inserted 3 rows into xmltab
37<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
37
SELECT (XSU Java API)
import java.sql.*;
import oracle.xml.sql.query.*;
import oracle.jdbc.*;
public class sampGetXML {
public static void main(String args[]) throws SQLException {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger @");
OracleXMLQuery qry = new OracleXMLQuery(conn,"select * from emp");
String xmlString = qry.getXMLString();
System.out.println(" OUTPUT IS:\n"+xmlString);
qry.close();
conn.close();
}
}
import java.sql.*;
import oracle.xml.sql.query.*;
import oracle.jdbc.*;
public class sampGetXML {
public static void main(String args[]) throws SQLException {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger @");
OracleXMLQuery qry = new OracleXMLQuery(conn,"select * from emp");
String xmlString = qry.getXMLString();
System.out.println(" OUTPUT IS:\n"+xmlString);
qry.close();
conn.close();
}
}
38<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
38
SELECT (XSU Java API), Forts. zur Generierung von XML wird die Java-Klasse OracleXMLQuery verwendet
Erzeugung einer Instanz von OracleXMLQuery mit Übergabe des SQL-Statements und der Verbindung als Parameter
Beispiel:
OracleXMLQuery qry = new OracleXMLQuery(conn, "SELECT * FROM emp");
OracleXMLQuery qry = new OracleXMLQuery(conn, "SELECT * FROM emp");
Generierung der DOM-Darstellung anstelle String-Darstellung
XML Document domDOC = (XMLDocument)qry.getXMLDOM();XML Document domDOC = (XMLDocument)qry.getXMLDOM();
39<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
39
INSERT (XSU Java API)
public class sampInsert{
public static void main(String args[]) throws SQLException{
String tabName = "emp"; String fileName = "sampdocins.xml";
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");
OracleXMLSave sav = new OracleXMLSave(conn, tabName);
URL url = sav.getURL(fileName);
int rowCount = sav.insertXML(url);
System.out.println(" successfully inserted "+rowCount+" rows into "+tabName);
conn.close();
}
}
public class sampInsert{
public static void main(String args[]) throws SQLException{
String tabName = "emp"; String fileName = "sampdocins.xml";
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");
OracleXMLSave sav = new OracleXMLSave(conn, tabName);
URL url = sav.getURL(fileName);
int rowCount = sav.insertXML(url);
System.out.println(" successfully inserted "+rowCount+" rows into "+tabName);
conn.close();
}
}
Beispiel für INSERT mit Werten in allen Spalten
40<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
40
Bestandteile des XDK
XML Parser
Schema Processor
Class Generator
XML Trans-viewer Beans
XSQL Servlet
XSU XSU
XSLT Processor
Java C++ C PL/SQL
41<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
41
XSQL XML + SQL Bestandteil des Oracle XDK (XML
Development Kit) XML-formatierte Ausgabe von relational
gespeicherten Daten in jedem DBMS verfügbar Grundidee:
– relational gespeicherte Daten als XML darstellen– Einbettung von SQL-Anweisungen in XML– Weiterverarbeitung mittels XSL-Stylesheets möglich
42<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
42
Vorteile von XSQL Pages einfache Generierung von XML-Dokumenten
auf der Basis von SQL Queries erlaubt Insert-, Update- und Delete-
Operationen unterstützt XSL Transformation durch
Anwendung von XML Stylesheets, beliebige Zielformate wie z.B. HTML
dient als Input für den XSQL Page Processor
Trennung der Daten von der Darstellung
43<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
43
XSQL Page Verarbeitung
Bestandteile XSQL Pages
– SQL Queries– DML und DDL in XML Tags
XSQL Page Processor (in Java)– nimmt XSQL Pages als Input– erzeugt dynamische XML Seiten mit den Ergebnissen der
SQL-Queries
XSQL Servlet– erlaubt XSQL Page Verarbeitung im Web
Erweiterbare Stylesheets– optional– XSL Transformationen zur Formatierung des Output
44<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
44
XSQL Page Processor Architektur
XSL Stylesheet
XSQL Page
XML o.a. Formate
XSQLConfig
Datenbank
XSQL Page Processor
XSLT
XML Parser
XML Utility
JDBC
45<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
45
Verarbeitung von XSQL Pages
<?xml version=“1.0“ ?><xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“> SELECT ‘Hello World‘ AS greeting FROM DUAL</xsql:query>
<?xml version=“1.0“ ?><xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“> SELECT ‘Hello World‘ AS greeting FROM DUAL</xsql:query>
XSQL Page Input
XML Output
<ROWSET><ROW num=“1“><GREETING>Hello World</GREETING></ROW></ROWSET>
<ROWSET><ROW num=“1“><GREETING>Hello World</GREETING></ROW></ROWSET>
Einführendes Beispiel
46<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
46
XSQL Queries und ConnectionsXSQL Page erlaubt die Definition von SQL Queries Query ist eingebettet in ein xsql:query Tag Connection-Attribut definiert die
Verbindungsinformaiton zur Datenbank Connection Name wird aufgelöst in einer
Konfigurationsdatei XSQLConfig.xml (in xsql/lib) Beispiel
<connectiondefs><connection name=“demo“><username>xuser</username><password>xuser</password><dburl>jdbc:oracle:thin:@localhost:1521:mydb</dburl><driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>... </connectiondefs>
<connectiondefs><connection name=“demo“><username>xuser</username><password>xuser</password><dburl>jdbc:oracle:thin:@localhost:1521:mydb</dburl><driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>... </connectiondefs>
47<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
47
XSQL Tags (Auswahl) <xsql:query>
Abfrage der Datenbank über XSU (kann über zusätzliche Optionen gesteuert werden / siehe nächste Folie)
<xsql:dml>erlaubt die Ausführung beliebiger DML- und DDL-Operationen (INSERT, CREATE TABLE etc.) und jedes PL/SQL-Blockes
<xsql:insert-request>Einfügen von XML-Dokumenten in die Datenbank (Voraussetzung: kanonisches Format)
<xsql:delete-request>Löschen von Zeilen aus SQL-Tabelle, Angabe der Schlüsselspalten erforderlich
<xsql:update-request>Änderung von Zeilen einer SQL-Tabelle, identifizierende Spalten angeben
48<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
48
Anpassung von XSQL Queries
rowset-element Elementname für Anfrageergebnis; leerer String, wenn kein Elementname gewünscht
row-element Elementname für jede Zeile im Anfrageergebnis; leerer String, wenn kein Name gewünscht
max-rows Maximalanzahl von Zeilen, die vom Ergebnis ausgegeben werden sollen, sinnvoll z.B. für Top-N-Queries
skip-rows Anzahl von Zeilen, die übersprungen werden soll vor Darstellung des Ergebnisses
id-attribute Attributname für id-Attribute für jede Zeile im Anfrageergebnis
id-attribute-column
Zu nutzender Spaltenname, um den Wert des id-Attributs in jeder Ergebniszeile zu liefern
null-indicator Wenn auf “y“ oder „“yes“ gesetzt: Null-Indicator-Attribut bei den Elementen genutzt, dessen Wert NULL ist
Attribute für xsql:query:
49<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
49
XSQL Query Parameter
Beispiel: Deklaration einer parametrisierten Query in einer XSQL Page
Die Parameterwerte können in einer URL geliefert werden, z.B.:http://localhost/xsql/demo/emp.xsql?find=A&sort=SAL
<?xml version=“1.0“ ?><?xml-stylesheet type=“text/xsl“ href=“emp.xsl“?><xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“
find=“%“ sort=“ENAME“ null-indicator=“yes“>
SELECT * FROM EMP WHERE ENAME LIKE ‘%{@find}%‘ORDER BY {@sort}
</xsql:query>
<?xml version=“1.0“ ?><?xml-stylesheet type=“text/xsl“ href=“emp.xsl“?><xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“
find=“%“ sort=“ENAME“ null-indicator=“yes“>
SELECT * FROM EMP WHERE ENAME LIKE ‘%{@find}%‘ORDER BY {@sort}
</xsql:query>
50<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
50
Nested Cursor erzeugen in SQL-Anfragen die XML-typische
Baumstruktur (anstelle von Tabellen) Beispiel:FBEREICH STUDIENGANG SEMESTER BEZEICHNUNG
IMN IN 1 Grundlagen der Informatik
IMN IN 1 Analysis 1
Baumstruktur in XML:
IMN |-IN |- 1.Semester |- Grundlagen der Informatik |- Analysis 1
51<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
51
Beispiel Nested Cursor
Tiefe 1: Gruppierte Auflistung aller Fachbereiche
Tiefe 2: Auflistung der Studiengänge pro Fachbereich
Tiefe 3: Auflistung der Semester pro Studiengang und Fachbereich
Tiefe 4: Auflistung aller Fächer pro Semester und Studiengang und Fachbereich
52<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
52
Beispiel Nested Cursor (2)
Tiefe 3: Fachbereich → Studiengang → Semester
<ROWSET> <ROW num="1"> <FBEREICH>IMN</FBEREICH> <STUDGANG> <STUDGANG_ROW num="1"> <STUDIENGANG>IN</STUDIENGANG> <SEMESTER> <SEMESTER_ROW num="1"> <SEMESTER>1</SEMESTER> </SEMESTER_ROW> <SEMESTER_ROW num="2"> <SEMESTER>2</SEMESTER> </SEMESTER_ROW> </SEMESTER> </STUDGANG_ROW> </STUDGANG> </ROW>. . .</ROWSET>
53<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
53
Beispiel Nested Cursor (3)
Tiefe 3: Fachbereich → Studiengang → Semester SQL-Befehl mit Nested Cursor (XML-Output vgl. vorige Folie)
select f.fbereich, cursor (select fa.studiengang, cursor (select fae.semester from faecher fae where
fae.fbereich=f.fbereich and fae.studiengang=fa.studiengang group by fae.semester) as semester
from faecher fa where fa.fbereich=f.fbereich group by fa.studiengang) as studgangfrom faecher f group by f.fbereich
Kommentare:– GROUP BY verhindert Redundanz im Baum– in WHERE-Klausel des Cursors Referenz auf die höheren Ebenen
54<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
54
Aufruf XSQL Page Processor
Kommando-Zeile
JavaApplikation
XSQLServlet
Java ServerPage
XSQL PageProcessor
55<<<Nr.>
© Prof. T. Kudraß, HTWK Leipzig
55
XSQL Servlet Environment
Web Server mitServlet Engine
XSQL PageProcessor
XSQL Servlet
JDBChttp
Oracle DBWeb-Browser