Ordner und Dateien: Das virtuelle Dateisystem der Datenbank nutzen

Wussten Sie schon, dass die Oracle-Datenbank mit einem vollständigen virtuellen Dateisystem ausgestattet ist?

Wenn Sie OracleXE nutzen, kennen Sie es bereits. Die statischen Dateien und Bilder von Application Express werden dort gespeichert; außerdem wird der HTTP-Zugang zu diesem Dateisystem als Webserver genutzt. Allerdings können Sie das Dateisystem (nicht nur mit OracleXE, sondern auch mit allen anderen Datenbankeditionen) auch selbst nutzen. Neben dem HTTP-Zugang steht auch ein FTP-Server zur Verfügung. In diesem Tipp erfahren Sie mehr über das virtuelle Dateisystem der Datenbank und wie Sie es nutzen können.

Hintergrund

Das virtuelle Dateisysten wurde zusammen mit der XML DB, also der XML-Technologie in der Oracle-Datenbank eingeführt. Daher wird es häufig auch als XML DB Repository bezeichnet. Auch hier wird es von nun an so genannt. Es können jedoch nicht nur XML-Dokumente, sondern alle möglichen Dateitypen gespeichert werden.

Nützlich ist es überall dort, wo eine Hierarchie von Verzeichnissen und Dateien (eben wie in einem Dateisystem) benötigt wird, die Inhalte selbst jedoch in der Datenbank gespeichert werden sollen. Natürlich kann man dies auch mit eigenen Tabellen selbst erstellen, das XML DB Repository stellt die Funktionalität jedoch fertig und sofort nutzbar bereit.

Vorbereitungen

Das XML DB Repository selbst ist nach einer Standard-Installation der Datenbank sofort vorhanden, es sind keine besonderen Schritte erforderlich. Aus Sicherheitsgründen sind die FTP- und HTTP-Zugänge standardmäßig jedoch abgeschaltet. Zunächst werden wir diese also aktivieren. Sie benötigen DBA-Rechte auf der Datenbank, um die folgenden Schritte durchzuführen.

Starten Sie auf dem Datenbankserver SQL*Plus , melden Sie sich als SYS an und starten Sie das Skript $ORACLE_HOME/rdbms/admin/catxdbdbca.sql. Daraufhin sollten Sie die folgende Bildschirmausgabe erhalten. Geben Sie, wie hier dargestellt, einen TCP/IP-Port für FTP und HTTP ein. Wenn Sie einen der Zugänge oder beide abschalten möchten, geben Sie Null (0) als Port an.

SQL*Plus: Release 10.2.0.3.0 - Production on Sun Jul 1 21:29:01 2007

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining options

SQL> @?/rdbms/admin/catxdbdbca
SQL> SET FEEDBACK 1
SQL> SET NUMWIDTH 10
SQL> SET LINESIZE 80
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE 100
SQL>
SQL> define ftpport  = &1
Enter value for 1: 2100
SQL> define httpport = &2
Enter value for 2: 8080

Wenn das Skript durchgelaufen ist, können Sie mit einem Aufruf von lsnrctl status prüfen, ob die Ports nun geöffnet sind.

$ lsnrctl status

LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 01-JUL-2007 21:32:32

Copyright (c) 1991, 2006, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=demo.de.oracle.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.3.0 - Production
Start Date                01-JUL-2007 19:44:45
Uptime                    0 days 1 hr. 47 min. 47 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/u01/app/oracle/product/10.2.0/network/admin/listener.ora
Listener Log File         /oracle/u01/app/oracle/product/10.2.0/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=demo.de.oracle.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=demo.de.oracle.com)(PORT=8080))(Presentation=HTTP)(Session=RAW))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=demo.de.oracle.com)(PORT=2100))(Presentation=FTP)(Session=RAW))
Services Summary...
Service "ORCL.world" has 1 instance(s).
:
:

Erste Schritte

Testen Sie das ganze nun mit einem FTP-Client Ihrer Wahl. Melden Sie sich mit einem Datenbank-User an, wechseln Sie in den Ordner public, legen Sie dort einen neuen Ordner APEX-Test an und laden Sie ein paar Dateien hoch.

D:\myData\bilder> ftp -n
ftp> open 192.168.2.150 2100
Connected to 192.168.2.150.
220- demo
Unauthorised use of this FTP server is prohibited and may be subject to civil and criminal prosecution.
220 demo FTP Server (Oracle XML DB/Oracle Database) ready.
ftp> user scott tiger
331 pass required for SCOTT
230 SCOTT logged in
ftp> cd /public
250 CWD Command successful
ftp> mkdir APEX-Test
257 MKD Command successful
ftp> cd APEX-Test
250 CWD Command successful
ftp> bin
200  Type set to I.
ftp> put Tegernsee01.JPG
200 PORT Command successful
150 BIN Data Connection
226 BIN Transfer Complete
ftp: 985662 bytes sent in 0,61Seconds 1613,19Kbytes/sec.
ftp> put Tegernsee02.JPG
200 PORT Command successful
150 BIN Data Connection
226 BIN Transfer Complete
ftp: 966003 bytes sent in 0,10Seconds 9660,03Kbytes/sec.
ftp> put Tegernsee03.JPG
200 PORT Command successful
150 BIN Data Connection
226 BIN Transfer Complete
ftp: 906549 bytes sent in 0,10Seconds 9065,49Kbytes/sec.
ftp> bye

Natürlich funktionieren auch grafische FTP-Clients. Die folgende Abbildung 1 zeigt die Ansicht auf den gleichen Ordner mit dem Windows Explorer.

Zugriff auf das XML DB Repository mit dem Windows Explorer

Abbildung 1: Zugriff auf das XML DB Repository mit dem Windows Explorer

Und natürlich können die Dateien über den HTTP-Zugriff einfach per Browser angesprochen werden. Die URL für das eben hochgeladene Bild Tegernsee01.JPG lautet dann http://[host]:8080/public/APEX-Test/Tegernsee01.jpg. Insofern eignet sich das XML DB Repository sehr gut, um bspw. HTML-Hilfetexte zu speichern. Die Verknüpfung mit Hyperlinks kann in gewohnter Manier erfolgen, da das XML DB Repository wie ein Dateisystem arbeitet.

Nutzung mit einer APEX-Anwendung

Nun erfahren Sie, wie Sie die Ordnerstruktur und die hochgeladenen Dateien in einer APEX-Anwendung betrachten können. Erstellen Sie zunächst eine leere Anwendung mit mindestens einer leeren Seite - in diese werden Sie nun eine Sicht auf die Verzeichnisse des XML DB Repository platzieren.

Zum Zugriff auf das XML DB Repository mit SQL stehen Ihnen einerseits die View RESOURCE_VIEW und andererseits das PL/SQL-Paket DBMS_XDB zur Verfügung Navigieren Sie in den SQL Workshop und setzen Sie dort folgende Query ab:

select
  any_path || '/' as path
 ,substr(any_path, 1, instr(any_path, '/', -1)) as parent_path
from resource_view
where existsnode(res, '/Resource[@Container="true"]')=1
union all (
  select
    '/' path
   ,null as parent_path
  from dual
)

Man sieht dann dieser Abfrage sehr gut, dass das XML DB Repository mit der XML DB eingeführt wurde - Die Metadaten werden mit Hilfe der XML-Funktionen EXTRACT, EXTRACTVALUE oder EXISTSNODE abgefragt.

Die zweite Spalte ermittelt zu jedem Pfad den Elternpfad - das ist wichtig, denn in die APEX-Anwendung soll die Ordnerhierarchie als Baumstruktur dargestellt werden. Die WHERE-Klausel sorgt außerdem dafür, dass nur Ordner angezeigt werden. Das Ergebnis sollte in etwa wie in Abbildung 2 aussehen. Erzeugen Sie diese Abfrage anschließend als View und geben Sie dieser den Namen XDB_FOLDERS.

Abfrage der Ordnerstruktur des XML DB Repository im SQL Workshop

Abbildung 2: Abfrage der Ordnerstruktur des XML DB Repository im SQL Workshop

Erzeugen Sie nun auf einer Application Express-Seite eine neue Baumstruktur. Navigieren Sie dazu zu den Gemeinsamen Komponenten, dort zu Baumstrukturen und klicken dort auf Erstellen. Im folgenden sind nur die wichtigsten Dialoge aufgeführt, in den anderen können Sie die Einstellungen auf dem jeweils vorgegebenen Standard belassen.

Baum erstellen: Benennung, initiale Anzahl der Ebenen und Startelement

Abbildung 3: Baum erstellen: Benennung, initiale Anzahl der Ebenen und Startelement

Geben Sie Ihrem Baum einen Namen (hier: T_XDB_FOLDERS), legen Sie fest, wieviele Hierarchieebenen initial aufgeklappt werden sollen und dass die "Baum-Wurzel" hier statisch ist.

Baumwurzel festlegen

Abbildung 4: Baumwurzel festlegen

Die Wurzel des Baums ist das Verzeichnis "/".

Datenbasis für den Baum festlegen

Abbildung 5: Datenbasis für den Baum festlegen

Die Daten für den Baum kommen aus vorhin erzeugten der View XDB_FOLDERS.

Hierarchie-Beziehung festlegen

Abbildung 6: Hierarchie-Beziehung festlegen

Die Ordner-Hierarchie bestimmt sich durch die Spalten PATH und PARENT_PATH in der View XDB_FOLDERS. Im Moment werden noch keine Links hinzugefügt.

Wählen Sie die restlichen Einstellungen nach Geschmack aus oder belassen Sie sie bei den vorgegebenen Standards. Nach Erstellung sollte Ihr Baum in etwa wie in Abbildung 7 aussehen.

Hierarchie-Beziehung festlegen

Abbildung 7: Das vorläufige Ergebnis ... der Baum

Sie sehen, dass der Baum die Ordnerhierarchie wie im FTP-Client wiedergibt; als Nächstes erweitern wir die Seite um die Darstellung der Dateien, die sich im jeweiligen Ordner befinden und eine Download-Möglichkeit.

Erstellen Sie auf der gleichen Seite ein ausgeblendetes Element PX_FOLDER und einen Bericht mit folgender SQL-Abfrage:

select
  extractvalue(res, '/Resource/DisplayName') FILENAME,
  extractvalue(res, '/Resource/ContentType') FILETYPE,
  dbms_lob.getlength(xdburitype(any_path).getblob()) FILESIZE,
  resid as resid
from resource_view
where under_path(res, :PX_FOLDER) = 1

Navigieren Sie nun zu den Eigenschaften des Baums und ändern Sie die SQL-Abfrage wie in Abbildung 8 dargestellt um - dadurch wird jeder Ordner zu einem Link; ein Klick darauf verzweigt auf dieselbe Seite, füllt das Element PX_FOLDER, wodurch der Bericht die Dateien dieses Folders anzeigt.

SQL-Abfrage des Baums ändern: Link hinzufügen

Abbildung 8: SQL-Abfrage des Baums ändern: Link hinzufügen

Positionieren Sie den Bericht noch und passen Sie das Template an. Wenn Sie die Seite starten, sollte das Ergebnis in etwa wie in Abbildung 9 aussehen.

Das Ergebnis: Ordner-Baum und Dateien des jeweiligen Ordners

Abbildung 9: Das Ergebnis: Ordner-Baum und Dateien des jeweiligen Ordners

Nun geht es daran, die Inhalte einer Datei anzuzeigen. Navigieren Sie zunächst zu den Gemeinsamen Komponenten , dort zu den Anwendungselementen und erstellen Sie ein neues Anwendungselement FILE_ID. Navigieren Sie anschließend zu den Anwendungsprozessen und erstellen Sie einen neuen Anwendungsprozess mit Namen Zeige Datei. Wählen Sie einen Bedarfsgesteuerten Prozeß (Abbildung 10) ...

Bedarfsgesteuerten Anwendungsprozeß erzeugen

Abbildung 10: Bedarfsgesteuerten Anwendungsprozeß erzeugen

... mit folgendem PL/SQL-Code:

declare
  v_uri xdburitype;
  v_mimetype varchar2(200);
  v_filename varchar2(200);
  v_blob     blob;
begin
  select
    xdburitype(any_path)
   ,extractvalue(res, '/Resource/DisplayName')
   ,extractvalue(res, '/Resource/ContentType')
  into v_uri, v_filename, v_mimetype
  from resource_view
  where resid=:FILE_ID;

  if v_mimetype = 'text/xml' then
    v_blob := v_uri.getblob(nls_charset_id('AL32UTF8'));
  else
    v_blob := v_uri.getblob();
  end if;

  owa_util.mime_header(v_mimetype, false);
  htp.p('Content-length: '||dbms_lob.getlength(v_blob));
  htp.p('Content-disposition: inline; filename='||v_filename);
  owa_util.http_header_close;
  wpg_docload.download_file(v_blob);
end;

Navigieren Sie anschließend wieder zu den Attributen des vorhin erzeugten Berichts. Verstecken Sie als erstes die Spalte RESID; diese wird nur für den nun folgenden Link benötigt und soll nicht dargestellt werden. Klicken Sie dann auf das Edit-Symbol der Spalte FILENAME ...

Berichtsspalte "FILENAME" bearbeiten

Abbildung 11: Berichtsspalte FILENAME bearbeiten

... und hinterlegen Sie hier bei Link einen Verweis auf folgende URL :

f?p=&APP_ID.:&APP_PAGE_ID.:&SESSION.:APPLICATION_PROCESS=Zeige Datei:::FILE_ID:#RESID#
Link hinterlegen ... Das Verweis-Ziel ist "URL"

Abbildung 12: Link hinterlegen ... Das Verweis-Ziel ist "URL"

Starten Sie die Seite nun neu - navigieren Sie durch den Baum, klicken Sie auf einen Ordner und dann auf eine der Dateien. Das Ergebnis sollte wie in Abbildung 13 aussehen.

Das Ergebnis: Anzeige der hochgeladenen Datei

Abbildung 13: Das Ergebnis: Anzeige der hochgeladenen Datei

Nun haben Sie zusätzlich zu den standardmäßig vorhandenen Zugriffen via FTP und HTTP auch einen Application Express-Zugang zum XML DB Repository. Bis hierhin haben Sie eine Möglichkeit kennengelernt, Dateien auch per FTP in die Datenbank hochzuladen und dann von APEX aus zu nutzen. Natürlich sind auch weitergehende Möglichkeiten denkbar: So können die Inhalte selbstverständlich aus dem Repository in eigene Tabellen kopiert oder Inhalte per APEX-Dialog ins Repository hochgeladen werden. Mehr dazu in der nächsten Ausgabe.

Zurück zur Community-Seite