entwicklung von xml-anwendungen mit oracle xsu
DESCRIPTION
Oberseminar Datenbanken Andreas Rebs, 01INM. Entwicklung von XML-Anwendungen mit ORACLE XSU. Oberseminar Datenbanken Andreas Rebs, 01INM. Erste Fragen. Was bedeutet eigentlich XSU ? Nach welchem Prinzip arbeitet XSU ? - PowerPoint PPT PresentationTRANSCRIPT
Entwicklung von XML-Anwendungen
mit ORACLE XSU
Oberseminar Datenbanken Andreas Rebs, 01INM
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 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-onspaket integriert
Oberseminar Datenbanken Andreas Rebs, 01INM
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
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 passen-den Elemente aus dem XML-Dokument
• Ausführen des generierten SQL-State-ments 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 Attri-bute; sonst erfolgt Akualisierung aller Attri-bute
• 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üsselspalteSAL ← 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-State-ments 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 Web-Server 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 Ziel-tabelle
• 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 Java-Applikationen angeboten
• Registrierung der JDBC-Klasse und Ver-bindung mit Datenbank herstellenimport 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 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");
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 XML-Dateinamens als Parameter
Oberseminar Datenbanken Andreas Rebs, 01INM
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
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 An-zahl 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 An-zahl 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-Um-gebung 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()" optionalcreate 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 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
Oberseminar Datenbanken Andreas Rebs, 01INM
Quellen
• Oracle XML SQL Utility User Guidehttp://otn.oracle.com/docs/tech/xml/oracle_xsu/doc_library/adx04xsu.html
• Oracle9i Application Developer's Guidehttp://download-eu.oracle.com/otndoc/oracle9i/901_doc/appdev.901/a88894/toc.htm
• Oracle8i Application Developer's Guidehttp://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/appdev.817/a86030/adx04xsu.htm