© 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)
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
© 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
(...)
Oracle XML Infrastruktur
interMedia PL/SQL XML
Packages
Java Applikationen Java XML SQL Utility
Java XML Parser JDBC Driver Jserver Runtime
URIs
Tabellen
© 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‘
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...
} }
© 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
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
© 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
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
© 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‘);
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...
© 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
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
© 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
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
© 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
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
© 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
Ü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
© 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>]
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>]
© 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
© 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>
...
© 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
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();
} }
© 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();
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;
/
© 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;
/
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 (?,?,?,?,?,?,?);
© 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
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>
© 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
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
© 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
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
© 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
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()
© 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
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
© 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
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
© 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
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
© 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
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 *
© 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;
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>