• Keine Ergebnisse gefunden

Speichern von XML in Oracle

N/A
N/A
Protected

Academic year: 2022

Aktie "Speichern von XML in Oracle"

Copied!
49
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)
(2)

© Prof. T. Kudraß, HTWK Leipzig

Ansätze zum Speichern von XML

 komplettes XML-Dokument in einer Tabellenspalte vom Typ CLOB

(“authored XML“)

 Aufteilung des XML-Dokuments in Teile und

Speicherung in mehreren Spalten in einer oder mehreren Tabellen (“generated XML“)

 Kombination beider Ansätze (hybrider Ansatz)

(3)

Authored XML

name document(CLOB)

Shopping Cart <Shopping Cart>

<Item sku = “1234567“>

<Desc>Fun with XML</Desc>

<Qty>1</Qty>

<Discount>10</Discount>

</Item>

(...)

</ShoppingCart>

Speichern der XML-Dokumente in einer Tabellenspalte

XMLDOCS

(4)

© Prof. T. Kudraß, HTWK Leipzig

Generated XML

nicht geeignet für XML-Dokumente mit komplexer Struktur

Alternative: Speicherung der XML-Elemente in mehreren Tabellen

Speichere jedes XML-Element in einer Tabellenspalte SHOPPING_CART

id description quantity discount

1234 Fun with XML 1 10

3942 XML in Space 4 7

(...)

(5)

Oracle XML Infrastruktur

interMedia PL/SQL XML

Packages

Java Applikationen Java XML SQL Utility

Java XML Parser JDBC Driver Jserver Runtime

URIs

Tabellen

(6)

© Prof. T. Kudraß, HTWK Leipzig

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=>theBFiel,

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‘

(7)

Arbeit mit CLOBs (Java)

public class ReadCLOB { ...

public static void main (String args[]{

DriverManager.registerDriver(new

oracle.jdbc.driver.OracleDriver());

Connection conn = DriverManager.getConnection(

“jdbc:oracle:thin:@myComp:1521:ORCL“,“xuser“,“xuser“);

PreparedStatement p = conn.prepareStatement(

“select doc from xmldocs where name = ?“);

p.setString(1,args[0]);

ResultSet rs = p.executeQuery();

CLOB theCLOB = ((OracleResultSet)rs.getCLOB(1);

// process the result, store document in a file...

} }

(8)

© Prof. T. Kudraß, HTWK Leipzig

Überblick interMedia Services

Eigenschaften von interMediaText

Volltext-Retrieval in der Oracle-Datenbank und externen Dateien

Thesaurus-basierte Suche

Themenanalyse von (englischen) Dokumenten

Highlighting von Treffern (Hervorhebungen im Dokument)

Oracle interMedia bietet Services zum Management

großer Textdokumente und Multimedia-Daten, wie Bilder,

Audio und Video

(9)

interMedia Text

 2 Benutzer-Rollen:

CTXSYS: Eigentümer der interMedia Schema- Objekte

CTXAPP: Zugriff auf die Funktionen

 Retrieval- und Speicherungsfunktionen:

Konvertieren von Texten mit Filtern

Sprachspezifisches Indizieren (“Lexer“)

Stammwortbasierte (stemming) und unscharfe Anfragen (fuzzy logic) mittels Wordlist

Speicherung von Index-Tabellen

Anlegen von Stop-Word-Listen

Definition von Search Sections durch Section Groups

(10)

© Prof. T. Kudraß, HTWK Leipzig

Text Retrieval mit interMedia Text

SQL-Erweiterungen für Text-Retrieval

contains Operator in der where -Klausel einer Anfrage: Suche nach Wort-Übereinstimmungen in einem Dokument

score - Operator: berechnet Relevanz eines Treffers (in einem Bereich 1..100)

within -Klausel: beschränkt die Anfrage auf Abschnitte (Sections) eines Dokuments

wichtig bei XML Sections

 übliche logische SQL-Operatoren: and , or , not

(11)

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)

© Prof. T. Kudraß, HTWK Leipzig

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)

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)

© Prof. T. Kudraß, HTWK Leipzig

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)

Oracle 9i XML Type

createXML(xml IN varchar2 return XMLType

createXML(xml IN clob) return XMLType

existsNode(xpath IN varchar2) return number

extract(xpath IN varchar2) return XMLType

isFragment() return number // 1 oder 0

getClobVal() return clob

getStringVal() return varchar2

getNumberVal() return number

Funktionen des Oracle XML Type

(16)

© Prof. T. Kudraß, HTWK Leipzig

Nutzung des XML Type

select d.document.extract(‘/Item/desc/text()‘).getStringVal() from xmldocs d;

Extraktion von Daten aus XML-Dokumenten mittels XML Type Funktionen

select * from xmldocs d where

d.document.extract(‘/Item/Qty/text()‘).getNumberVal()=4;

select * from xmldocs d

where d.document.existsNode(‘//Discount‘)=1;

Insert, Update und Delete auf Spalten vom Typ XMLType erlaubt Zugriff auf XMLType in der DB in Java möglich mittels Klasse:

oracle.xdb.XMLType

(17)

Oracle 9i Uri-Referenzen (Uri-refs)

Uri-refs speichern Referenzen zu Dokumenten innerhalb und außerhalb der Datenbank, z.B.:

http://www.xml.com/ShoppingCart#//item/desc

Uri-refs sind Generalisierung von URL und REF (Pointer- Semantik im Dokument)

Funktionen von Uri-refs:

getClob():liefert Dokument an angegebener URL

getUrl(): liefert URL, die in UriType gespeichert ist

Uri-ref

FTPUri-ref

DBUri-ref HTTPUri-ref

(18)

© Prof. T. Kudraß, HTWK Leipzig

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

(19)

XSU Java API

XSU-Funktionalitäten werden über über die Java-

Klassen OracleXMLQuery und OracleXMLSave zum Einbinden in Java-Applikationen angeboten

Registrierung der JDBC-Klasse und Verbindung mit Datenbank herstellen

import oracle.jdbc.driver.*;

DriverManager.registerDriver(new

oracle.jdbc.driver.OracleDriver());

Connection conn =

DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");

import oracle.jdbc.driver.*;

DriverManager.registerDriver(new

oracle.jdbc.driver.OracleDriver());

Connection conn =

DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");

verschiedene Driver-Typen (s. Vorlesung Internet-DB):

-

Thin

(20)

© Prof. T. Kudraß, HTWK Leipzig

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

(21)

Überblick: XSU-Optionen

Steuern die XSU-Verarbeitung

 Struktur des erzeugten XML beeinflussen

 Exception Handling anpassen

 Paginations-Mechanismen für Ergebnismengen

 Commit-Verhalten steuern

 Bind-Variablen für dynamische Anfragen und

DML-Operationen verwenden

(22)

© Prof. T. Kudraß, HTWK Leipzig

XSU Kommandozeilen-Optionen (1)

Optionen für getXML :

[-user “user/password“]

[-conn “JDBC_connect_string“]

[-withDTD]

[-useDOMDoc] Default:String API

[-rowsetTag <row_set_tag>] Default ROWSET

[-rowTag <row_separator_tag>] Default ROW

[-rowIdAttr <attrName>]

[-rowIdColumn <column_name>]

[-collectionIdAttr <attrNamr>]

(23)

XSU Kommandozeilen-Optionen (2)

Optionen für getXML (Forts.):

[-useNullAttrId]

[-styleSheet <stylesheet URI>]

[-styleShetType <stylesheet type]

[-useLowerCase | -useUpperCase]

[-errorTag <error_tag>]

[-raiseException]

[-raiseNoRowsException]

[-maxRows <max_num_of_rows>]

[-skipRows <num_of_rows_to_skip>]

[-encoding <encoding_name>]

(24)

© Prof. T. Kudraß, HTWK Leipzig

XSU Kommandozeilen-Optionen (2)

Optionen für put XML:

[-user “username/password“]

[-conn “JDBC_connect_string“]

[-insertBatch <size>]

[-commitBatch <size>]

[-rowTag <row_separator_tag>]

[-dateFormat <date_format>]

[-ignoreCase]

-filename <file_name> | -URL

<document_URL> | -xmlDoc

<XML_document_string>

TableName

(25)

© Prof. T. Kudraß, HTWK Leipzig

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>

...

(26)

© Prof. T. Kudraß, HTWK Leipzig

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

(27)

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

} }

(28)

© Prof. T. Kudraß, HTWK Leipzig

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

XML Document domDOC = (XMLDocument)qry.gfetXMLDOM();

(29)

SELECT (PL/SQL), Beispiel 1

declare

queryCtx DBMS_XMLquery.ctxType;

result CLOB;

begin

-- set up the query context

queryCtx := DBMS_XMLQuery.newContext('SELECT * FROM emp');

-- get the result

result := DBMS_XMLQuery.getXML(queryCtx);

-- use the result to put in tables/send as messages. . . printClobOut(result);

-- close the query handle!

DBMS_XMLQuery.closeContext(queryCtx);

end;

/

declare

queryCtx DBMS_XMLquery.ctxType;

result CLOB;

begin

-- set up the query context

queryCtx := DBMS_XMLQuery.newContext('SELECT * FROM emp');

-- get the result

result := DBMS_XMLQuery.getXML(queryCtx);

-- use the result to put in tables/send as messages. . . printClobOut(result);

-- close the query handle!

DBMS_XMLQuery.closeContext(queryCtx);

end;

/

(30)

© Prof. T. Kudraß, HTWK Leipzig

SELECT (PL/SQL), Beispiel 2

declare

queryCtx DBMS_XMLquery.ctxType;

result CLOB;

begin

queryCtx := DBMS_XMLQuery.newContext(

'SELECT * FROM emp

WHERE empno = :EMPNO AND ename = :ENAME');

DBMS_XMLQuery.setBindValue(queryCtx,'EMPNO',7566);

DBMS_XMLQuery.setBindValue(queryCtx,'ENAME','JONES');

result := DBMS_XMLQuery.getXML(queryCtx);

printClobOut(result);

DBMS_XMLQuery.closeContext(queryCtx);

end;

/

declare

queryCtx DBMS_XMLquery.ctxType;

result CLOB;

begin

queryCtx := DBMS_XMLQuery.newContext(

'SELECT * FROM emp

WHERE empno = :EMPNO AND ename = :ENAME');

DBMS_XMLQuery.setBindValue(queryCtx,'EMPNO',7566);

DBMS_XMLQuery.setBindValue(queryCtx,'ENAME','JONES');

result := DBMS_XMLQuery.getXML(queryCtx);

printClobOut(result);

DBMS_XMLQuery.closeContext(queryCtx);

end;

/

(31)

Einfügen aus XML (INSERT)

Analyse der Metadaten der Zieltabelle

Generierung eines Statements der Form:

Extrahieren der zu den Metadaten passenden Elemente aus dem XML-Dokument

Ausführen des generierten SQL-Statements unter Verwendung der extrahierten Daten

INSERT INTO emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) VALUES (?,?,?,?,?,?,?);

INSERT INTO emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO) VALUES (?,?,?,?,?,?,?);

(32)

© Prof. T. Kudraß, HTWK Leipzig

Aktualisieren mit XML (UPDATE)

 Festlegung von Schlüsselattributen, die zur Identifizierung der zu aktualisierenden

Datensätze dienen

 Festlegung der zu aktualisierenden Attribute;

sonst erfolgt Aktualisierung aller Attribute

 Analyse der Metadaten der Zieltabelle

 Generierung eines Update-Statements

 Extrahieren der Daten aus XML-Dokument

(33)

Aktualisieren mit XML (UPDATE)

Bsp.: EMPNO ← Schlüsselspalte SAL ← zu aktualisierende Spalte

UPDATE emp SET SAL=800 WHERE EMPNO=7369;

UPDATE emp SET SAL=800 WHERE EMPNO=7369;

<?xml version='1.0'?>

<ROWSET>

<ROW num="1">

<EMPNO>7369</EMPNO>

<JOB>CLERK</JOB>

<SAL>800</SAL>

<DEPTNO>20</DEPTNO>

</ROW>

</ROWSET>

<?xml version='1.0'?>

<ROWSET>

<ROW num="1">

<EMPNO>7369</EMPNO>

<JOB>CLERK</JOB>

<SAL>800</SAL>

<DEPTNO>20</DEPTNO>

</ROW>

</ROWSET>

(34)

© Prof. T. Kudraß, HTWK Leipzig

Löschen mit XML (DELETE)

 Festlegung von Schlüsselattributen, die zur Identifizierung der zu löschenden Datensätze dienen

 Analyse der Metadaten der Zieltabelle

 Generierung eines DELETE-Statements

 Extrahieren der Daten aus XML-Dokument

 Ausführung des generierten SQL-Statements

unter Verwendung der extrahierten Daten

(35)

Speichern (Java), INSERT

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

(36)

© Prof. T. Kudraß, HTWK Leipzig

Speichern (Java), UPDATE

import oracle.xml.sql.dml.OracleXMLSave;

. . .

// connect to the database . . .

OracleXMLSave sav = new OracleXMLSave(conn, “emp");

String[] keyColNames = new String[1];

keyColNames[0] = “EMPNO";

sav.SetKeyColumnList(keyColNames);

String[] colNames = new String[2];

colNames[0] = “ENAME";

colNames[1] = “SAL";

sav.setUpdateColumnList(colNames); . . . sav.updateXML(XMLDoc);

sav.close();

import oracle.xml.sql.dml.OracleXMLSave;

. . .

// connect to the database . . .

OracleXMLSave sav = new OracleXMLSave(conn, “emp");

String[] keyColNames = new String[1];

keyColNames[0] = “EMPNO";

sav.SetKeyColumnList(keyColNames);

String[] colNames = new String[2];

colNames[0] = “ENAME";

colNames[1] = “SAL";

sav.setUpdateColumnList(colNames); . . . sav.updateXML(XMLDoc);

sav.close();

Beispiel für UPDATE mit Spaltenliste

(37)

Speichern (PL/SQL), INSERT

create or replace procedure insProc(xmlDoc IN CLOB, tableName IN VARCHAR2) is

insCtx DBMS_XMLSave.ctxType;

rows number;

begin

insCtx := DBMS_XMLSave.newContext(tableName);

rows := DBMS_XMLSave.insertXML(insCtx,xmlDoc);

DBMS_XMLSave.closeContext(insCtx);

end;

/

create or replace procedure insProc(xmlDoc IN CLOB, tableName IN VARCHAR2) is

insCtx DBMS_XMLSave.ctxType;

rows number;

begin

insCtx := DBMS_XMLSave.newContext(tableName);

rows := DBMS_XMLSave.insertXML(insCtx,xmlDoc);

DBMS_XMLSave.closeContext(insCtx);

end;

/

Beispiel-Anwendung für DBMS_XMLSave bei einem INSERT

(38)

© Prof. T. Kudraß, HTWK Leipzig

Speichern (PL/SQL), UPDATE

create or replace procedure testUpdate(xmlDoc IN CLOB, tableName IN VARCHAR2) is

updCtx DBMS_XMLSave.ctxType;

rows number;

begin

updCtx := DBMS_XMLSave.newContext(tableName);

DBMS_XMLSave.clearUpdateColumnList(updCtx);

DBMS_XMLSave.setUpdateColumn(updCtx,'SAL');

DBMS_XMLSave.setUpdateColumn(updCtx,'JOB');

DBMS_XMLSave.setKeyColumn(updCtx,'EMPNO');

rows := DBMS_XMLSave.updateXML(updCtx, xmlDoc);

DBMS_XMLSave.closeContext(updCtx);

end;

/

create or replace procedure testUpdate(xmlDoc IN CLOB, tableName IN VARCHAR2) is

updCtx DBMS_XMLSave.ctxType;

rows number;

begin

updCtx := DBMS_XMLSave.newContext(tableName);

DBMS_XMLSave.clearUpdateColumnList(updCtx);

DBMS_XMLSave.setUpdateColumn(updCtx,'SAL');

DBMS_XMLSave.setUpdateColumn(updCtx,'JOB');

DBMS_XMLSave.setKeyColumn(updCtx,'EMPNO');

rows := DBMS_XMLSave.updateXML(updCtx, xmlDoc);

DBMS_XMLSave.closeContext(updCtx);

end;

/

Beispiel-Anwendung für DBMS_XMLSave bei einem UPDATE

(39)

DELETE (Java)

public class sampDelete{

public static void main(String args[]) throws SQLException{

String tabName = "emp"; String fileName = "sampdocdel.xml";

DriverManager.registerDriver(new

oracle.jdbc.driver.OracleDriver());

Connection conn =

DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");

OracleXMLSave sav = new OracleXMLSave(conn, tabName);

String [] keyColNames = new String[1]; keyColNames[0] = "DEPTNO";

sav.setKeyColumnList(keyColNames);

URL url = sav.getURL(fileName);

int rowCount = sav.deleteXML(url);

System.out.println(" successfully deleted "+rowCount+" rows from "+ tabName);

conn.close();

public class sampDelete{

public static void main(String args[]) throws SQLException{

String tabName = "emp"; String fileName = "sampdocdel.xml";

DriverManager.registerDriver(new

oracle.jdbc.driver.OracleDriver());

Connection conn =

DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");

OracleXMLSave sav = new OracleXMLSave(conn, tabName);

String [] keyColNames = new String[1]; keyColNames[0] = "DEPTNO";

sav.setKeyColumnList(keyColNames);

URL url = sav.getURL(fileName);

int rowCount = sav.deleteXML(url);

System.out.println(" successfully deleted "+rowCount+" rows from "+ tabName);

conn.close();

Beispiel für Anwendung von deleteXML()

(40)

© Prof. T. Kudraß, HTWK Leipzig

DELETE (PL/SQL)

create or replace procedure testDelete(xmlDoc IN CLOB, tableName IN VARCHAR2) is

delCtx DBMS_XMLSave.ctxType;

rows number;

begin

delCtx := DBMS_XMLSave.newContext(tableName);

DBMS_XMLSave.setKeyColumn(delCtx,'DEPTNO');

rows := DBMS_XMLSave.deleteXML(delCtx, xmlDoc);

DBMS_XMLSave.closeContext(delCtx);

end;

/

create or replace procedure testDelete(xmlDoc IN CLOB, tableName IN VARCHAR2) is

delCtx DBMS_XMLSave.ctxType;

rows number;

begin

delCtx := DBMS_XMLSave.newContext(tableName);

DBMS_XMLSave.setKeyColumn(delCtx,'DEPTNO');

rows := DBMS_XMLSave.deleteXML(delCtx, xmlDoc);

DBMS_XMLSave.closeContext(delCtx);

end;

/

Beispiel-Anwendung von DBMS_XMLSave bei einem DELETE

Gebrauch von setKeyColumn() optional

(41)

Fallstudie: Anpassung Content

 Anpassung (Customization) beliebiger XML- Formate für INSERT-Operationen mit XSU

 Schritte:

Analysiere die strukturellen Unterschiede zwischen Original-XML-Dokument und der Zieltabelle

Baue das Transformation Stylesheet und transformiere das Dokument entsprechend

Verwende XML SQL Utility zum Einfügen der Daten

in die Datenbank

(42)

© Prof. T. Kudraß, HTWK Leipzig

Fallstudie (2)

<?xml version=“1.0“ encoding=“iso-8859-1“?><!DOCTYPE moreovernews SYSTEM “http://p.moreover.com/xml/xml_dtds/moreovernews.dtd“>

<moreovernews>

<article id=“_12699134“>

<url>http://c.moreover.com/click/here.pl?x12699131</url>

<headline_text>EDI system to speed up textile exports

</headline_text>

<source>The Nation - Thailand</source>

<media_type>text</media_type>

<cluster>XML and metadata news</cluster>

<tagline></tagline>

<document_url>http://www.nationmultimedia.com/new/business.shtml

</document_url>

<harvest_time>Nov 29 2000 7:47PM</harvest_time>

<access_registration></access registration>

<access_status></access_status>

<article>

...

<?xml version=“1.0“ encoding=“iso-8859-1“?><!DOCTYPE moreovernews SYSTEM “http://p.moreover.com/xml/xml_dtds/moreovernews.dtd“>

<moreovernews>

<article id=“_12699134“>

<url>http://c.moreover.com/click/here.pl?x12699131</url>

<headline_text>EDI system to speed up textile exports

</headline_text>

<source>The Nation - Thailand</source>

<media_type>text</media_type>

<cluster>XML and metadata news</cluster>

<tagline></tagline>

<document_url>http://www.nationmultimedia.com/new/business.shtml

</document_url>

<harvest_time>Nov 29 2000 7:47PM</harvest_time>

<access_registration></access registration>

<access_status></access_status>

<article>

...

Ausschnitt aus einem Zeitungsarchiv

(43)

Fallstudie (3)

create sequence newsstory_id_seq;

create table newsstory ( id number,

title varchar2(200), url varchar2(200), source varchar2(80) );

create trigger newsstory_before_insert before insert on newsstory for each row BEGIN

SELECT newsstory_id_seq-nextval INTO :new.id

FROM dual;

END;

/

create sequence newsstory_id_seq;

create table newsstory ( id number,

title varchar2(200), url varchar2(200), source varchar2(80) );

create trigger newsstory_before_insert before insert on newsstory for each row BEGIN

SELECT newsstory_id_seq-nextval INTO :new.id

FROM dual;

END;

/

Newssstory ist die Ziel-Tabelle beim Einfügen

(44)

© Prof. T. Kudraß, HTWK Leipzig

Fallstudie (4)

<?xml version = ‘1.0‘?>

<ROWSET xmlns:xsl=“http://www.w3.org/1999/XSL/Transform“

xsl:version=“1.0“>

<xsl:for-each select=“moreovernews/article“>

<ROW>

<TITLE><xsl:value-of select=“headline_text“/></TITLE>

<URL><xsl:value-of select=“url“/></URL>

<SOURCE><xsl:value-of select=“source“/></SOURCE>

</ROW>

</xsl:for-each>

</ROWSET>

<?xml version = ‘1.0‘?>

<ROWSET xmlns:xsl=“http://www.w3.org/1999/XSL/Transform“

xsl:version=“1.0“>

<xsl:for-each select=“moreovernews/article“>

<ROW>

<TITLE><xsl:value-of select=“headline_text“/></TITLE>

<URL><xsl:value-of select=“url“/></URL>

<SOURCE><xsl:value-of select=“source“/></SOURCE>

</ROW>

</xsl:for-each>

</ROWSET>

Anwendung des Stylesheet produziert kanonisches XML-Format

<?xml version = ‘1.0‘?>

<ROWSET>

<ROW num=“1“>

<TITLE>Oracle Technet Goes Live</TITLE>

<URL>http://technet.oracle.com</URL>

<SOURCE>Oracle</SOURCE>

</ROW>

</ROWSET>

<?xml version = ‘1.0‘?>

<ROWSET>

<ROW num=“1“>

<TITLE>Oracle Technet Goes Live</TITLE>

<URL>http://technet.oracle.com</URL>

<SOURCE>Oracle</SOURCE>

</ROW>

</ROWSET>

Beispiel-Dokument

(45)

Behandlung von Nested XML (1)

 Speicherung und Wiedergewinnung von

mehrfach geschachtelten XML-Dokumenten in Oracle mit Hilfe von Object Types und Object Views

 Schritte

Definiere die passenden Tabellen und Object Types

Baue eine Object View, die mit Dokumentstruktur übereinstimmt

Nutze Object Views für Insert- und Retrieval-

Operationen in XSU

(46)

© Prof. T. Kudraß, HTWK Leipzig

Behandlung von Nested XML (2)

<?xml version=‚‘1.0‘ encoding=‚‘UTF-8‘?>

<ROWSET>

<ROW><Book>

<ISBN>0449908585</ISBN>

<Title>Fun with XML</Title>

<Price>13</Price>

<Author>

<First>Paul</First>

<Last>Theroux</Last>

</Author>

</Book></ROW>

. . .

</ROWSET>

<?xml version=‚‘1.0‘ encoding=‚‘UTF-8‘?>

<ROWSET>

<ROW><Book>

<ISBN>0449908585</ISBN>

<Title>Fun with XML</Title>

<Price>13</Price>

<Author>

<First>Paul</First>

<Last>Theroux</Last>

</Author>

</Book></ROW>

. . .

</ROWSET>

XML Source Dokument

(47)

Behandlung von Nested XML (3)

Object

Types first

last Person_T

isbn title price Book_T

first_name last_name Author_Table

isbn title price Book_Table Schema der Ziel-Datenbank:

Tabellen

1 *

(48)

© Prof. T. Kudraß, HTWK Leipzig

Behandlung von Nested XML (4)

CREATE VIEW book as SELECT Book_T (b.ISBN,

b.Title, b.Price,

Person_T(a.First_Name, a.Last_Name) ) as Book

FROM book_table b, author_table a WHERE b.author_id = a.id;

CREATE VIEW book as SELECT Book_T (b.ISBN,

b.Title, b.Price,

Person_T(a.First_Name, a.Last_Name) ) as Book

FROM book_table b, author_table a WHERE b.author_id = a.id;

Object View nutzbar für Retrieval- und Insert-Operationen Anlegen einer View auf der Basis von Object Types:

XSU kann SQL Cursor Operator nutzen in SQL-Statements, um beliebig geschachtelte XML-Dokumente zu erzeugen:

SELECT id,first_name,last_name CURSOR (SELECT isbn,title,price

FROM book_table b

WHERE a.id = b.author_id) as book FROM author_table a;

SELECT id,first_name,last_name CURSOR (SELECT isbn,title,price

FROM book_table b

WHERE a.id = b.author_id) as book FROM author_table a;

(49)

Behandlung von Nested XML (5)

Object View nutzbar für Retrieval- und Insert-Operationen Ergebnis-Dokument

<?xml version=‚‘1.0‘ encoding=‚‘UTF-8‘?>

<ROWSET>

<ROW num=“1“>

<ID>2000</ID>

<FIRST_NAME>Paul</FIRST_NAME>

<LAST_NAME>Theroux</LAST_NAME>

<BOOK>

<BOOK_ROW num=“1“>

<ISBN>449908585</ISBN>

<TITLE>Fun with XML</TITLE>

<PRICE>13</PRICE>

</BOOK_ROW>

<BOOK_ROW num=“2“>

. . .

</BOOK_ROW>

</BOOK>

</ROW>

<?xml version=‚‘1.0‘ encoding=‚‘UTF-8‘?>

<ROWSET>

<ROW num=“1“>

<ID>2000</ID>

<FIRST_NAME>Paul</FIRST_NAME>

<LAST_NAME>Theroux</LAST_NAME>

<BOOK>

<BOOK_ROW num=“1“>

<ISBN>449908585</ISBN>

<TITLE>Fun with XML</TITLE>

<PRICE>13</PRICE>

</BOOK_ROW>

<BOOK_ROW num=“2“>

. . .

</BOOK_ROW>

</BOOK>

</ROW>

Referenzen

ÄHNLICHE DOKUMENTE

 Ist in die XML-Datei eine XSL-Datei eingebunden, wird diese auch ausgeführt, sodass man das transformierte Dokument sieht. HTTP und Darstellung

-- Definition eines Subtyps Buch von Katalogeintrag CREATE OR REPLACE TYPE buch UNDER katalogeintrtag (. isbn VARCHAR2(13), titel VARCHAR2(300), autor

– repräsentiert durch section group im CREATE INDEX - Befehl / PARAMETERS Klausel. – erlauben inhaltsbasiertes Retrieval, beschränkt auf spezifische

-- STORE AS CLOB erzwingt Speicherung als CLOB CREATE TABLE letter OF XMLTYPE;.. -- STORE AS CLOB erzwingt Speicherung

Erzeugen Sie weiterhin mittels Texteditor für jede Abteilung ein gültiges XML-Dokument EmpDept&lt;xx&gt;.xml (xx = 10, 20...), das dem Schema EmpDept.xsd entspricht.. Diese

Erzeugen Sie eine Abteilungsstatistik, indem Sie die benötigten Informationen aus dem XML-Dokument in der Tabelle companytab (bzw. Pro Abteilung sollen dabei

• Erzeugung eines Context Handles mittels der Funktion &#34;newContext()&#34;; SQL-Abfrage wird als Parameter übergeben.

Das liefert eine Befehlsfolge, die den Wert der rechten Seite oben auf dem Stack ablegt.. • Speichere nun diesen Wert in der Zelle für die linke