38
Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

Embed Size (px)

Citation preview

Page 1: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

Entwicklung von XML-Anwendungen

mit ORACLE XSU

Oberseminar Datenbanken Andreas Rebs, 01INM

Page 2: 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 ?

Page 3: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 4: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 5: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

Page 6: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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>

Page 7: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 8: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 9: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

Page 10: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 11: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 12: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 13: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 14: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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>"

Page 15: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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>"

Page 16: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

Oberseminar Datenbanken Andreas Rebs, 01INM

XSU Command Line Front End (INSERT)

– ignoreCase– commitBatch "<commit_size>"

Page 17: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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@");

Page 18: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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");

Page 19: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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();

}

}

Page 20: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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()"

Page 21: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 22: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 23: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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();

}

}

Page 24: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 25: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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();

}

}

Page 26: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 27: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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();

}

}

Page 28: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 29: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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);

Page 30: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

/

Page 31: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 32: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

/

Page 33: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 34: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

/

Page 35: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

/

Page 36: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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;

/

Page 37: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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

Page 38: Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM

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