380 likes | 473 Views
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 ?
E N D
Oberseminar Datenbanken Andreas Rebs, 01INM Entwicklung von XML-Anwendungen mit ORACLEXSU
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ü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-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 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 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()" 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 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