Arbeitshinweise für XML-Datenbanken 1. Einrichten und Erproben des OracleXML SQL Utility (XSU) Das OracleXML SQL Utility, der Version 1.2, welches in dem XDK for PL/SQL 8.1.7 enthalten ist, wurde auf dem Oracle-Server (goliath.imn.htwk-leipzig.de) der HTWK unter dem User „xmluser“ installiert. Damit können die Funktionen von XSU serverseitig sowohl in PL/SQL-Proceduren als auch in Javaklassen verwendet werden. Mit der im XSU enthaltenen Testrotieren (oraclexmlsqltest.sql), wurde die Installation auf ihre Betriebs- und Funktionstüchtigkeit geprüft. sqlplus username/password@imnlehre @oraclexmlsqltesttk.sql Das XSU kann aber auch clientseitig verwendet werden. Hierzu sind keine zusätzlichen Zugriffsrechte nötig, da das XDK in der Datenbank nicht verwendet wird. Getestet wurde die clientseitige Funktionstüchtigkeit mit einem Beispiel von Steve Muench, welches entsprechend angepasst wurde. Dieses Beispiel ist im Folgenden abgedruckt. Mit diesem SQL-Skript wurde zuerst eine Tabelle für dieses Beispiel in der Datenbank erzeugt. create table newsstory( id number primary key, title varchar2(200), url varchar2(200), source varchar2(200) ); Um den Import mit XSU zu testen wird ein entsprechendes XML-Dokument benötigt, wie es zum Beispiel hier zu sehen ist. File: input.xml <?xml version="1.0"?> <ROWSET> <ROW> <ID>1</ID> <TITLE>Some Title</TITLE> <URL>http://somemachine/somepage.html</URL> <SOURCE>SomeSource</SOURCE> </ROW> </ROWSET> Anschließend konnte der Import in die Datenbank mit XSU erfolgreich ausgeführt werden. Dazu mussten im PC-Pool (L107) erst die entsprechenden Umgebungsvariablen gesetzt werden und das XDK installiert werden. Die Dateien des XDK wurden in das Verzeichnis „E:\Oracle\xdk_java_9“ kopiert. (Das XDK wurde nur zum Test auf dem Rechner Nr. 5 installiert.) Es ist aber auch möglich die XDK-Bibliotheken zu benutzen, welche mit dem JDeveleoper installiert wurden. Diese Bibliotheken sind aber wesentlich älter als das aktuelle XDK. Das folgende Beispiel funktionierte aber auch mit diesen Bibliotheken. Zusätzlich ist das XDK und auch der JDBC-Treiber auf dem Netzlaufwerk N:\InformatikPool\install\ora_erw2. Set XDK_DIR=E:\Oracle\xdk_java_9 java -classpath E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\ classes12.zip; %XDK_DIR%\lib\xmlparserv2.jar; %XDK_DIR%\lib\xsu12.jar" OracleXML putXML -conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre" -user "username/password" -fileName input.xml newsstory oder: java -classpath "E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\ classes12.zip;E:\Oracle\JDeveloper 3.1.1.2\lib\xmlparserv2.jar; E:\Oracle\JDeveloper 3.1.1.2\lib\oraclexmlsql.jar" OracleXML putXML -conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre" -user "username/password" -fileName input.xml newsstory Output: successfully inserted 1 rows into newsstory Auch das Exportieren verlief ohne Fehlermeldung, sowohl mit XSU als auch mit XSQL. java -classpath "E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\ classes12.zip; %XDK_DIR%\lib\xmlparserv2.jar; %XDK_DIR%\lib\xsu12.jar" OracleXML getXML -conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre" -user "username/password" "select * from newsstory" oder: java -classpath "E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\ classes12.zip;E:\Oracle\JDeveloper 3.1.1.2\lib\xmlparserv2.jar; E:\Oracle\JDeveloper 3.1.1.2\lib\oraclexmlsql.jar" OracleXML getXML -conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre" -user "username/password" "select * from newsstory" Output: <?xml version = '1.0'?> <ROWSET> <ROW num="1"> <ID>1</ID> <TITLE>Some Title</TITLE> <URL>http://somemachine/somepage.html</URL> <SOURCE>SomeSource</SOURCE> </ROW> </ROWSET> 2. Einrichten und Testen des XML-Datei-Imports in den Datentyp Clob Die Vorgehensweise zum Importieren von Dateien in eine Tabelle der Datenbank Oracle soll an einem Beispiel erklärt werden. Zuerst muss eine Tabelle erzeugt werden, die eine Spalte vom Typ Clob enthält, in welche die Dateien gespeichert werden sollen. Die Beispieltabelle wird wie folgt angelegt: create table xmldocs( filename varchar2(255), document clob, primary key (filename) ); Für das Importieren von Dateien in diese Tabelle stellt Oracle mehrer Möglichkeiten zur Verfügung. Zwei davon wurden vom Autor getestet und werden hier beschrieben. Importieren von XML-Dateien aus einem Verzeichnis heraus Um Dateien aus einem bestimmten Verzeichnis heraus in die Datenbank zu importieren, muss ein Verzeichnislink in der Datenbank erstellt werden. Dafür ist das Recht: create any directory zum Erstellen und drop any directory zum Löschen des Verzeichnislinks notwendig. Erstellt wird der Verzeichnislink mit: create directory xmlfiledir /home/david/i99/username/xmlfiles Das im Beispiel angegebene Verzeichnis muss zuvor auf dem Datenbankserver (Goliath) erstellt werden und es müssen auf dieses Verzeichnis leserechte für alle Benutzer erlaubt sein. Mit der folgenden PL/SQL-Funktion kann dann eine XML-Datei importiert werden. create or replace procedure xmlinsert ( xmldirectory in varchar2, xmlfilename in varchar2) as theClob CLOB; theBFile BFILE := BFileName(xmldirectory,xmlfilename); begin if (dbms_lob.fileexists(theBFile) = 1) then -- existiert die Datei? insert into xmldocs(filename,document) values (xmlfilename, empty_clob()) returning document into theClob; -- theBFile:=BFileName(xmldirectory,xmlfilename); dbms_output.put_line('successfully insert.'); dbms_lob.fileOpen (theBFile); dbms_output.put_line('successfully open.'); dbms_lob.loadFromFile (theClob,theBFile,dbms_lob.getLength(theBFile)); dbms_output.put_line('successfully load.'); dbms_lob.fileClose(theBFile); commit; dbms_output.put_line('File successfully loaded.'); else dbms_output.put_line('File does not exist.'); -- nein: Fehlermeldung end if; exception -- Exceptions fangen und Fehlermeldungen ausgeben when dbms_lob.noexist_directory then dbms_output.put_line('Directory does not exist.'); when dbms_lob.nopriv_directory then dbms_output.put_line('You do not have privileges for the directory.'); when dbms_lob.invalid_directory then dbms_output.put_line('Directory is invalid.'); end; Das Importieren aus dem oben erstellten Verzeichnis erfolgt mit: execute xmlinsert ('xmlfiledir','othello.xml'); Importieren von XML-Dateien mit Java Das Importieren mit Java erfolgt mit JDBC. Bevor jedoch die Datei in die Tabelle importiert werden kann muss erst ein neuer Eintrag, mit einem leeren Clob-Objekt, in der Tabelle erzeugt werden. insert into xmldocs (filename, document) values ('filename.xml', empty_clob()) Danach wird mit dem Select-Befehl das leere Objekt aus der Datenbank geholt. SELECT document FROM xmldocs WHERE filename = 'filename.xml' Zurückgegeben wird jedoch nur eine Referenz auf das Objekt in der Datenbank. Über diese Referenz kann jetzt die zu importierende Datei in das Clob-Objekt geschrieben werden. Im Rahmen dieses Werkvertrags wurde dafür ein Programm geschrieben, welches wie folgt aufgerufen werden kann. java -classpath ".; E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\ classes12.zip; E:\Oracle\JDeveloper 3.1.1.2\lib\xmlparserv2.jar;" insertxmlfile -conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre" -user "username/password" "othello.xml" 3. Definition der Zugriffsrechte für das Oracle XDK Um die serverseitig installierten PL/SQL Pakete des XDK zu benutzen, muss der User folgende Zugriffsrechte besitzen: XML-Parser (alle im Packet xmlparserv2.jar enthaltene Funktionen) Zugriffsrechte auf die Pakete xmlparser, xmldom, xslprocessor des Users „xmluser“ sind erforderlich. Grant Execute on xmlparser to username; Grant Execute on xmldom to username; Grant Execute on xslprocessor to username; XML SQL Utility Zugriffsrechte auf das Paket xmlgen des Users „xmluser“ sind erforderlich. Grant Execute on xmlgen to username; Beim installieren von XSU in die Datenbank wird allen Usern dieses Recht schon gegeben. Es braucht also nicht noch einmal explizit gegeben werden. Alternativ zu dem Paket xmlgen können auch die Pakete DBMS_XMLQuery und DBMS_XMLSave definiert und verwendet werden. Diese haben zusammen die selben Funktionen wie xmlgen. Grant Execute on DBMS_XMLQuery to username; Grant Execute on DBMS_XMLSave to username; Auch für diese beiden Pakete wird beim Installieren gleich allen Usern das ExecuteRecht gegeben. Die Erstellung und Verwendung von serverseitigen Javaklassen, welche das XDK in der Datenbank verwenden, wurde bisher noch nicht überprüft. Vermutlich sind dafür Zugriffsrechte auf alle im XDK enthaltene Pakete und Klassen nötig. 4. Installation der Tamino-Benutzer und Datenbanken für die Vorlesung 5. Testen der Taminoclients im PC-Pool (L107) Der Taminoclient im PC-Pool ist vollständig installiert. Damit alle Tamino-Tools und auch die Dokumentation richtig funktionieren muss der Internet Explorer als Standardbrowser eingerichtet sein! Um einen Connect zur Tamino-Datenbank herzustellen, sind folgende Angaben nötig: Server: Database: http://141.57.9.57/tamino tamtest oder http://timon.imn.htwk-leipzig.de/tamino User: Password: Username des Sun-Pools Passwort des Sun-Pools revoke execute on xmlgen from tkrumbe;