2
<<
<
Nr
.>
2Überblick
XML Architekturformen und Speicherungsarten
XML Schema und Mapping
Laden von Daten
Zugriff
4
<<
<
Nr
.>
4Clob
Relational
Die Speicherart richtet sich nach den
Anforderungen der Anwendung:
• Konkurrierender Zugrif
• Vokabularänderung
• Ladeperformance
• Abfrage-Performance
• Redundanzen
• XML Schema Support
Oracle
Nativ als Dokument
Nativ
Objektrelational
5
<<
<
Nr
.>
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
.>
6Oracle und XML Schema
Typen Tabellen Java Beans
Security
generiert
SQL Data SQL Data
Schema
in der Datenbank
8
<<
<
Nr
.>
8Terminologie: "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 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 BOOLEAN
TRUE, --genTypes IN BOOLEAN := TRUE FALSE, --genbean IN BOOLEAN := FALSE TRUE, --genTables IN BOOLEAN := TRUE FALSE, --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 BOOLEAN
TRUE, --genTypes IN BOOLEAN := TRUE FALSE, --genbean IN BOOLEAN := FALSE TRUE, --genTables IN BOOLEAN := TRUE FALSE, --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 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 RELATIONAL
XMLSCHEMA "http://xmluser.de.oracle.com/xsd/deptemp.xsd"
ELEMENT "emptable";
CREATE TABLE dept_tab2 (deptno NUMBER, employee XMLTYPE) XMLTYPE employee STORE AS OBJECT RELATIONAL
XMLSCHEMA "http://xmluser.de.oracle.com/xsd/deptemp.xsd"
ELEMENT "emptable";
14
<<
<
Nr
.>
14Laden 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
.>
15Arbeit 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
.>
16Indizieren 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
.>
17Beispiel: 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.context
PARAMETERS (‘section group ctxsys.auto_section_group‘);
18
<<
<
Nr
.>
18Beispiel: 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, when FROM ins_claim
WHERE contains (doc,‘brakes WITHIN cause‘) > 0;
ID WHEN DOC
--- --- ---
1 12-OCT-00 The insured‘s <VEHICLE>car...
19
<<
<
Nr
.>
19Beispiel: 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.context
PARAMETERS(‘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 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
.>
21Laden über Internet Protokolle
23
<<
<
Nr
.>
23Sichtweise auf das Repository
Table
Name ACL Property
1 Property
N Property N
XML Table B Tree
Index Text
Index Hierarchical Index resource_view
FTP HTTP
xdb$resource
24
<<
<
Nr
.>
24XML 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
.>
25Funktionen 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 26
Funktionen auf XMLType - Beispiele
Anzahl der Kinder des Angestellten Meier als numerischer Wert
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal() AS Kinderzahl
FROM Personalakten P
WHERE P.Personalakte.extract(‘//Personalien/Nachname/text()‘).
getstringVal() = ‘Meier‘;
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal() AS Kinderzahl
FROM Personalakten P
WHERE 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 P
WHERE P.Personalakte.existsNode(‘//Personalien[Nachname="Meier"]‘);
SELECT P.Personalakte.extract((‘//@Kinder‘).getNumVal() AS Kinderzahl
FROM Personalakten P
WHERE P.Personalakte.existsNode(‘//Personalien[Nachname="Meier"]‘);
27 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 Nachname FROM Personalakten P
WHERE P.Personalakte.existsNode(
‘//Zeugnis[ora:contains(Zwischenzeugnis,"vollen" OR "vollsten")>0]‘);
SELECT P.Personalakte.extractValue('//Nachname') AS Nachname FROM Personalakten P
WHERE P.Personalakte.existsNode(
‘//Zeugnis[ora:contains(Zwischenzeugnis,"vollen" OR "vollsten")>0]‘);
28 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 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
.>
30SQL/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
.>
31SQL/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).getClobVal FROM PersonalaktenX p,
TABLE(XMLSequence(extract(value(p),‘//Gehalt‘))) g WHERE extractValue(value(g), ‘/Gehalt‘) >= 8000;
SELECT value(g).getClobVal FROM PersonalaktenX p,
TABLE(XMLSequence(extract(value(p),‘//Gehalt‘))) g WHERE extractValue(value(g), ‘/Gehalt‘) >= 8000;
32
<<
<
Nr
.>
32XQuery-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
xquery
for $i in ora:view("Auftrag")
return <Auftraggeber>{$i/Firma}</Auftraggeber>
xquery
for $i in ora:view("Auftrag")
return <Auftraggeber>{$i/Firma}</Auftraggeber>
Weitere Details im XQuery-Tutorial im Internet: http://xquery-tutorial.de.vu
33
<<
<
Nr
.>
33Das 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
.>
34XSU-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
.>
36Aufruf 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
.>
37SELECT (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
.>
38SELECT (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
.>
39INSERT (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
.>
40Bestandteile 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
.>
41XSQL
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
.>
42Vorteile 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
.>
43XSQL 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
.>
44XSQL Page Processor Architektur
XSL Stylesheet
XSQL Page
XML o.a.
Formate
XSQLConfig
Datenbank XSQL Page Processor
XSLT
XML Parser
XML Utility
JDBC
45
<<
<
Nr
.>
45Verarbeitung 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
.>
46XSQL Queries und Connections
XSQL 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
.>
47XSQL 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
.>
48Anpassung 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
.>
49XSQL 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
.>
50Nested 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
.>
51Beispiel 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
.>
52Beispiel 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
.>
53Beispiel 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 studgang
from faecher f group by f.fbereich
Kommentare:
–
GROUP BY verhindert Redundanz im Baum
–