Entwicklung von XML-Anwendungen
mit ORACLE XSU
Erste Fragen
• Was bedeutet eigentlich XSU ?
• Nach welchem Prinzip arbeitet XSU ?
• Wie kann man die Funktionalitäten von XSU überhaupt nutzen ?
Was bedeutet eigentlich XSU ?
• Oracle XML-SQL Utility
• Bindeglied zwischen relationalen Daten- banken und XML
• Generierung von XML aus Daten einer relationalen Datenbank
• Einfügen von XML in relationale Daten- banken
• ab Oracle8i (Version 8.1.7) im Installati-
Nach welchem Prinzip arbeitet XSU ?
• Generierung von XML-Dokumenten in ihrer String-Darstellung bzw als DOM-Modell aus SQL-Abfragen heraus
• Extrahieren von Daten aus XML-Doku- menten und Verwendung dieser für Ein- fügeoperationen auf Tabellen
• Extrahieren von Daten aus XML-Doku-
menten zum Zwecke von Aktualisierungs- und Löschoperationen auf Datensätze einer Tabelle
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
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>
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 passen- den Elemente aus dem XML-Dokument
• Ausführen des generierten SQL-State-
ments unter Verwendung der extrahierten
Aktualisieren mit XML (UPDATE)
• Festlegung von Schlüsselattributen, die zur Identifizierung der zu aktualisierenden Datensätze dienen
• Festlegung der zu aktualisierenden Attri- bute; sonst erfolgt Akualisierung aller Attri- bute
• 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
<?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;
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-State-
ments unter Verwendung der extrahierten Daten
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 Web- Server möglich
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
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
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>"
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 Ziel- tabelle
• Beispiel:
java OracleXML putXML –user "scott/tiger" –fileName "data.xml" "emp"
• Optionen:
– user "<username>/<password>"
XSU Command Line Front End (INSERT)
– ignoreCase
– commitBatch "<commit_size>"
XSU Java API
• XSU-Funktionalitäten werden über die Java-Klassen OracleXMLQuery und
OracleXMLSave zum Einbinden in Java- Applikationen angeboten
• Registrierung der JDBC-Klasse und Ver- bindung mit Datenbank herstellen
import oracle.jdbc.driver.*;
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn =
DriverManager.getConnection("jdbc:oracle:oci8:scott/tiger@");
XSU Java API (SELECT)
• zur Generierung von XML wird die Java- Klasse OracleXMLQuery verwendet
• Erzeugung einer Instanz von
OracleXMLQuery mit Übergabe des SQL- Statements und der Verbindung als Para- meter
• Beispiel:
OracleXMLQuery qry = new OracleXMLQuery(conn, "SELECT * FROM emp");
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();
} }
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()"
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 XML-
XSU Java API (INSERT)
• zum Einfügen von Inhalten aus XML- Dokumenten 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 An- zahl eingefügter Datensätze
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();
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 An- zahl aktualisierter Datensätze
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();
}
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 An- zahl gelöschter Datensätze
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();
XSU PL/SQL API
• XSU-Funktionalitäten werden über die Packages DBMS_XMLQuery und
DBMS_XMLSave in einer PL/SQL-Um- gebung zur Verfügung gestellt
• diese Packages spiegeln alle Operationen der XSU Java API wider
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:
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;
/
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
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;
/
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
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;
/
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);
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;
/
Zusammenfassung
• leistungsfähiges Werkzeug zum Daten-
austausch 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
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://download-eu.oracle.com/otndoc/oracle9i /901_doc/appdev.901/a88894/toc.htm
• Oracle8i Application Developer's Guide
http://otn.oracle.com/docs/products/oracle8i/d
oc_library/817_doc/appdev.817/a86030/adx04xsu.