Entwicklung von
XML-Anwendungen
mit ORACLE XSU
Oberseminar Datenbanken
Andreas Rebs, 01INM
Erste Fragen
• Was bedeutet eigentlich XSU ?
• Nach welchem Prinzip arbeitet XSU ?
• Wie kann man die Funktionalitäten von
XSU überhaupt nutzen ?
Oberseminar Datenbanken
Andreas Rebs, 01INM
Was bedeutet eigentlich XSU ?
• Oracle XML-SQL Utility
• Bindeglied zwischen relationalen Datenbanken und XML
• Generierung von XML aus Daten einer
relationalen Datenbank
• Einfügen von XML in relationale Datenbanken
• ab Oracle8i (Version 8.1.7) im Installationspaket integriert
Oberseminar Datenbanken
Andreas Rebs, 01INM
Nach welchem Prinzip arbeitet XSU ?
• Generierung von XML-Dokumenten in
ihrer String-Darstellung bzw als DOMModell aus SQL-Abfragen heraus
• Extrahieren von Daten aus XML-Dokumenten und Verwendung dieser für Einfügeoperationen auf Tabellen
• Extrahieren von Daten aus XML-Dokumenten zum Zwecke von Aktualisierungsund Löschoperationen auf Datensätze
einer Tabelle
Oberseminar Datenbanken
Andreas Rebs, 01INM
Generierung von XML (SELECT)
CREATE TABLE emp (
EMPNO NUMBER,
ENAME VARCHAR2(20),
JOB VARCHAR2(20),
MGR NUMBER,
HIREDATE DATE,
SAL NUMBER,
DEPTNO NUMBER
);
• Ausführen einer SQL-Abfrage
• Bsp.: SELECT * FROM emp WHERE EMPNO=7369;
Oberseminar Datenbanken
Andreas Rebs, 01INM
Generierung von XML (SELECT)
• Analyse der Metadaten der Ergebnismenge
• Konvertierung in folgende Form:
<?xml version='1.0'?>
<ROWSET>
<ROW num="1">
<EMPNO>7369</EMPNO>
<ENAME>Smith</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>12/17/1980 0:0:0</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>
Oberseminar Datenbanken
Andreas Rebs, 01INM
Einfügen aus XML (INSERT)
• Analyse der Metadaten der Zieltabelle
• Generierung eines Statements der Form:
INSERT INTO emp
(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,DEPTNO)
VALUES (?,?,?,?,?,?,?);
• Extrahieren der zu den Metadaten passenden Elemente aus dem XML-Dokument
• Ausführen des generierten SQL-Statements unter Verwendung der extrahierten
Daten
Oberseminar Datenbanken
Andreas Rebs, 01INM
Aktualisieren mit XML (UPDATE)
• Festlegung von Schlüsselattributen, die
zur Identifizierung der zu aktualisierenden
Datensätze dienen
• Festlegung der zu aktualisierenden Attribute; sonst erfolgt Akualisierung aller Attribute
• Analyse der Metadaten der Zieltabelle
• Generierung eines Update-Statements
• Extrahieren der Daten aus XML-Dokument
Oberseminar Datenbanken
Andreas Rebs, 01INM
Aktualisieren mit XML (UPDATE)
• Bsp.:
EMPNO ← Schlüsselspalte
SAL ← zu aktualisierende Spalte
<?xml version='1.0'?>
<ROWSET>
<ROW num="1">
<EMPNO>7369</EMPNO>
<JOB>CLERK</JOB>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>
UPDATE emp SET SAL=800 WHERE EMPNO=7369;
Oberseminar Datenbanken
Andreas Rebs, 01INM
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
Oberseminar Datenbanken
Andreas Rebs, 01INM
Wie kann man XSU benutzen ?
• drei verschiedene Möglichkeiten
– XSU Command Line Front End
– XSU Java API
– XSU PL/SQL API
• Ausführung direkt in der Datenbank, in
einer Client-Umgebung oder auf WebServer möglich
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Command Line Front End
• XSU Funktionalitäten zum Generieren von
XML aus relationalen Datenbanken und
zum Einfügen von XML in relationale
Datenbanken vorhanden
• Verwendung dieser Funktionen durch
Aufruf der Java-Klasse OracleXML
• Aufruf über Kommandozeile in der Form:
java OracleXML Parameter
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Command Line Front End (SELECT)
• Verwendung des Parameters getXML für
die Java-Klasse OracleXML, gefolgt von
weiteren optionalen Parametern und dem
SQL-Statement
• Beispiel:
java OracleXML getXML –user "scott/tiger" "SELECT * FROM emp"
• Optionen:
– user "<username>/<password>"
– withDTD
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Command Line Front End (SELECT)
– rowsetTag "<tag_name>"
– rowTag "<tag_name>"
– rowIdAttr "<row_id_attribute_name>"
– rowIdColumn "<row_id_column_name>"
– useNullAttrId
– maxRows "<maximum_number_of_rows>"
– skipRows "<number_of_rows_to_skip>"
– fileName "<sql_query_filename>"
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Command Line Front End (INSERT)
• Verwendung des Parameters putXML für
die Java-Klasse OracleXML, gefolgt von
weiteren optionalen Parametern und den
Namen vom XML-Dokument und der Zieltabelle
• Beispiel:
java OracleXML putXML –user "scott/tiger" –fileName "data.xml" "emp"
• Optionen:
– user "<username>/<password>"
– rowTag "<tag_name>"
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Command Line Front End (INSERT)
– ignoreCase
– commitBatch "<commit_size>"
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API
• XSU-Funktionalitäten werden über die
Java-Klassen OracleXMLQuery und
OracleXMLSave zum Einbinden in JavaApplikationen 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@");
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (SELECT)
• zur Generierung von XML wird die JavaKlasse OracleXMLQuery verwendet
• Erzeugung einer Instanz von
OracleXMLQuery mit Übergabe des SQLStatements und der Verbindung als Parameter
• Beispiel:
OracleXMLQuery qry = new OracleXMLQuery(conn, "SELECT * FROM emp");
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (SELECT)
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();
}
}
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (SELECT)
• statt der String-Darstellung kann auch die
DOM-Darstellung generiert werden
• Generierung erfolgt über die Funktion
"getXMLDOM()"
• Beispiel:
XMLDocument domDoc = (XMLDocument)qry.getXMLDOM();
• Paginating Reults
– "setSkipRows()"
– "setMaxRows()"
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API
• folgende Schreiboperationen auf die
Datenbank stehen zur Verfügung:
– INSERT
– UPDATE
– DELETE
• die Java-Klasse OracleXMLQuery stellt
die notwendigen Funktionen bereit
• Erzeugung einer Instanz von
OracleXMLSave mit Übergabe des XMLDateinamens als Parameter
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (INSERT)
• zum Einfügen von Inhalten aus XMLDokumenten steht die Funktion
"insertXML()" zur Verfügung
• als Parameter wird der Dateiname des
XML-Dokuments übergeben; wenn nötig,
mit Pfadangabe
• Rückgabewert dieser Funktion ist die Anzahl eingefügter Datensätze
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (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);
String [] colNames = new String[5]; colNames[0] = "EMPNO";
sav.setUpdateColumnList(colNames);
URL url = sav.getURL(fileName);
int rowCount = sav.insertXML(url);
System.out.println(" successfully inserted "+rowCount+" rows into
"+tabName);
conn.close();
}
}
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (UPDATE)
• zum Aktualisieren von Datensätzen
anhand der Daten aus XML-Dokumenten
steht die Funktion "updateXML()" zur
Verfügung
• als Parameter wird der Dateiname des
XML-Dokuments übergeben; wenn nötig,
mit Pfadangabe
• Rückgabewert dieser Funktion ist die Anzahl aktualisierter Datensätze
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (UPDATE)
public class sampUpdate{
public static void main(String args[]) throws SQLException{
String tabName = "emp"; String fileName = "sampdocupd.xml";
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn =
DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");
String [] keyColNames = new String[1]; keyColNames[0] = "EMPNO";
String [] updateColNames = new String[2]; updateColNames[0] = "SAL";
OracleXMLSave sav = new OracleXMLSave(conn, tabName);
sav.setKeyColumnList(keyColNames);
sav.setUpdateColumnList(updateColNames);
URL url = sav.getURL(fileName);
int rowCount = sav.updateXML(url);
System.out.println(" successfully updated "+rowCount+" rows from "+
tabName);
conn.close();
}
}
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (DELETE)
• zum Löschen von Datensätzen anhand
der Daten aus XML-Dokumenten steht die
Funktion "deleteXML()" zur Verfügung
• als Parameter wird der Dateiname des
XML-Dokuments übergeben; wenn nötig,
mit Pfadangabe
• Rückgabewert dieser Funktion ist die Anzahl gelöschter Datensätze
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU Java API (DELETE)
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();
}
}
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API
• XSU-Funktionalitäten werden über die
Packages DBMS_XMLQuery und
DBMS_XMLSave in einer PL/SQL-Umgebung zur Verfügung gestellt
• diese Packages spiegeln alle Operationen
der XSU Java API wider
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (SELECT)
• Erzeugung eines Context Handles mittels
der Funktion "newContext()"; SQL-Abfrage
wird als Parameter übergeben
• Beispiel:
queryCtx := DBMS_XMLQuery.newContext('SELECT * FROM emp');
• eigentliche Generierung von XML mittels
der Funktion "getXML()"; Rückgabewert ist
das XML-Dokument als CLOB
• Beispiel:
result := DBMS_XMLQuery.getXML(queryCtx);
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (SELECT)
declare
queryCtx DBMS_XMLquery.ctxType;
result CLOB;
begin
queryCtx := DBMS_XMLQuery.newContext('SELECT * FROM emp');
result := DBMS_XMLQuery.getXML(queryCtx);
printClobOut(result);
DBMS_XMLQuery.closeContext(queryCtx);
end;
/
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (SELECT)
• Funktion "getDTD()" liefert die Document
Type Definition
• Funktionen "setSkipRows()" und
"setMaxRows()" analog zur XSU Java API
• Umbenennung von Standard-Tag-Namen
über die Funktionen "setRowsetTag()" und
"setRowTag()" möglich
• Binding
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (SELECT)
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;
/
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API
• Erzeugung eines Context Handles mittels der
Funktion "newContext()"; Name der
Zieltabelle wird als Parameter übergeben
• Beispiel:
saveCtx := DBMS_XMLSave.newContext('emp');
• eigentliche Ausführung der Schreiboperation
mittels "insertXML()", "updateXML()" oder
"deleteXML()"; Übergabeparameter sind das
XML-Dokument als CLOB oder VARCHAR2
und der Name der Zieltabelle als VARCHAR2
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (INSERT)
• "setUpdateColumn()" optional
create or replace procedure testInsert(xmlDoc IN CLOB, tableName IN
VARCHAR2) is
insCtx DBMS_XMLSave.ctxType;
rows number;
begin
insCtx := DBMS_XMLSave.newContext(tableName);
DBMS_XMLSave.clearUpdateColumnList(insCtx);
DBMS_XMLSave.setUpdateColumn(insCtx,'EMPNO');
rows := DBMS_XMLSave.insertXML(insCtx, xmlDoc);
DBMS_XMLSave.closeContext(insCtx);
end;
/
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (UPDATE)
• "setUpdateColumn()" optional
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;
/
Oberseminar Datenbanken
Andreas Rebs, 01INM
XSU PL/SQL API (DELETE)
• "setKeyColumn()" optional
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;
/
Oberseminar Datenbanken
Andreas Rebs, 01INM
Zusammenfassung
• leistungsfähiges Werkzeug zum Datenaustausch zwischen XML und relationalen
Datenbanken
• verschiedene Möglichkeiten der Nutzung
von XSU vorhanden
• fehlende Möglichkeit für UPDATE- und
DELETE-Operationen bei Zugriff über das
Command Line Front End
Oberseminar Datenbanken
Andreas Rebs, 01INM
Quellen
• Oracle XML SQL Utility User Guide
http://otn.oracle.com/docs/tech/xml/oracle_xsu/d
oc_library/adx04xsu.html
• Oracle9i Application Developer's Guide
http://downloadeu.oracle.com/otndoc/oracle9i/901_doc/appdev.
901/a88894/toc.htm
• Oracle8i Application Developer's Guide
http://otn.oracle.com/docs/products/oracle8i/doc
_library/817_doc/appdev.817/a86030/adx04xsu.
htm
Oberseminar Datenbanken
Andreas Rebs, 01INM

Rebs