• Keine Ergebnisse gefunden

XML-Unterstützung in Oracle

N/A
N/A
Protected

Academic year: 2022

Aktie "XML-Unterstützung in Oracle"

Copied!
55
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)
(2)

2

<<

<

Nr

.>

2

Überblick

 XML Architekturformen und Speicherungsarten

 XML Schema und Mapping

 Laden von Daten

 Zugriff

(3)

4

<<

<

Nr

.>

4

Clob

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

(4)

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

(5)

6

<<

<

Nr

.>

6

Oracle und XML Schema

Typen Tabellen Java Beans

Security

generiert

SQL Data SQL Data

Schema

in der Datenbank

(6)

8

<<

<

Nr

.>

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.

(7)

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)

(8)

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";

(9)

14

<<

<

Nr

.>

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

(10)

15

<<

<

Nr

.>

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‘

(11)

16

<<

<

Nr

.>

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

(12)

17

<<

<

Nr

.>

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.context

PARAMETERS (‘section group ctxsys.auto_section_group‘);

(13)

18

<<

<

Nr

.>

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, when FROM ins_claim

WHERE contains (doc,‘brakes WITHIN cause‘) > 0;

ID WHEN DOC

--- --- ---

1 12-OCT-00 The insured‘s <VEHICLE>car...

(14)

19

<<

<

Nr

.>

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.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

(15)

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

(16)

21

<<

<

Nr

.>

21

Laden über Internet Protokolle

(17)

23

<<

<

Nr

.>

23

Sichtweise 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

(18)

24

<<

<

Nr

.>

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)

(19)

25

<<

<

Nr

.>

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)

(20)

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"]‘);

(21)

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]‘);

(22)

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

(23)

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

(24)

30

<<

<

Nr

.>

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

(25)

31

<<

<

Nr

.>

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).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;

(26)

32

<<

<

Nr

.>

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

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

(27)

33

<<

<

Nr

.>

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

(28)

34

<<

<

Nr

.>

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

(29)

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>

(30)

36

<<

<

Nr

.>

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

(31)

37

<<

<

Nr

.>

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();

} }

(32)

38

<<

<

Nr

.>

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();

(33)

39

<<

<

Nr

.>

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

(34)

40

<<

<

Nr

.>

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

(35)

41

<<

<

Nr

.>

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

(36)

42

<<

<

Nr

.>

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

(37)

43

<<

<

Nr

.>

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

(38)

44

<<

<

Nr

.>

44

XSQL Page Processor Architektur

XSL Stylesheet

XSQL Page

XML o.a.

Formate

XSQLConfig

Datenbank XSQL Page Processor

XSLT

XML Parser

XML Utility

JDBC

(39)

45

<<

<

Nr

.>

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

(40)

46

<<

<

Nr

.>

46

XSQL 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>

(41)

47

<<

<

Nr

.>

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

(42)

48

<<

<

Nr

.>

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 :

(43)

49

<<

<

Nr

.>

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>

(44)

50

<<

<

Nr

.>

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

(45)

51

<<

<

Nr

.>

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

(46)

52

<<

<

Nr

.>

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>

(47)

53

<<

<

Nr

.>

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 studgang

from faecher f group by f.fbereich

Kommentare:

GROUP BY verhindert Redundanz im Baum

in WHERE-Klausel des Cursors Referenz auf die höheren Ebenen

(48)

54

<<

<

Nr

.>

54

Aufruf XSQL Page Processor

Kommando- Zeile

Java Applikation

XSQL Servlet

Java Server Page

XSQL Page

Processor

(49)

55

<<

<

Nr

.>

55

XSQL Servlet Environment

Web Server mit Servlet Engine

XSQL Page Processor XSQL Servlet

http JDBC

Oracle DB

Web-Browser

Referenzen

ÄHNLICHE DOKUMENTE

fügen und offenzulegen, daß dies nicht der Fall ist.&#34; Dieser Schluß heißt also nichts ande- res, daß ein Anlagevermittler genau über das Objekt (das er dem Anleger andient)

Denn der Handel ist im Um- bruch: Die Marktdominanz einzelner Handels- plattformen wie Amazon, Ebay oder Galaxus in der Schweiz führt dazu, dass für die Produzen- ten der Zugang zu

The pharmaceutical industry has shown itself to be largely resistant to economic crises – even in the past two years, for example, during which there was a sub- stantial increase

different drumloops in several versions Volume: Loop 4-104BPM Size: 11,7 MB Description. different drumloops in

Institut für Allgemeine Pädagogik – Bildung und Technik | Prof.. Speicherung

1 Запчеста глава за дупчење 2 Прекинувач „Дупчење/ударно дупчење“ 3 Копче за фиксирање на прекинувачот за вклучување/исклучување 4 Прекинувач за

Main features Component systems mid/bass speaker with injected cone 25 mm soft dome tweeter with silk edge separate frequency crossover with integrated tweeter protection

Stezač alata SDS-plus Kapa za zaštitu od prašine Čahura za zabravljivanje Prsten za blokiranje izmjenjive stezne glave GBH 240 F Preklopka smjera rotacije Zaporna tipka prekidača