Ordner und Dateien: Das virtuelle Dateisystem der Datenbank nutzen

Hintergrund

In der letzten Ausgabe haben Sie das virtuelle Dateisystem der Oracle-Datenbank kennengelernt. Es wurde zusammen mit der XML DB, also der XML-Technologie in der Oracle-Datenbank eingeführt und wird daher häufig 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. In der letzten Ausgabe haben Sie erfahren, wie Sie das virtuelle Dateisystem aufsetzen, die Verzeichnisstruktur auslesen und die Inhalte von Dateien anzeigen können. Heute erfahren Sie, wie Sie aus einer Application Express-Oberfläche eine Datei speichern, so dass diese zum Abruf per FTP bereitsteht. Daneben stellen wir Funktionen zum Verlinken oder Umbenennen von Dateien vor.

Dateien hochladen

Ausgangspunkt ist das Ergebnis der letzten Ausgabe: In der Anwendungsseite ist links die Verzeichnisstruktur als Baum zu sehen; rechts sind die im ausgewählten Verzeichnis vorhandenen Dateien aufgelistet.

Ausgangspunkt: Verzeichnisstruktur und Dateien

Abbildung 1: Ausgangspunkt: Verzeichnisstruktur und Dateien

Fügen Sie der Seite nun ein neues Element vom Typ Datei hochladen ( PX_NEWFILE) und eine Schaltfläche zum Absenden hinzu. Achten Sie beim Erstellen der Schaltfläche darauf, dass die Seite weitergeleitet und nicht bloß umgeleitet wird. Die Seite sollte danach in etwa wie folgt aussehen:

Anwendungsseite mit Möglichkeit zum Datei-Upload

Abbildung 2: Anwendungsseite mit Möglichkeit zum Datei-Upload

Mit Klick auf die Schaltfläche Go wird die Datei nun hochgeladen; im Gegensatz zu früheren Tipps, in welchen die Datei in eine Tabelle übernommen wurde wird Sie dieses Mal ins XML DB Repository kopiert (achten Sie auf den Aufruf von DBMS_XDB.CREATERESOURCE). Hinterlegen Sie folgenden OnSubmit -Prozess vom Typ PL/SQL.

declare
  v_blob   blob;
  v_name   wwv_flow_files.filename%TYPE;

  v_return boolean;
begin
  begin
   select filename, blob_content
   into v_name, v_blob
   from wwv_flow_files
   where name = :PX_NEWFILE;

   v_return := dbms_xdb.createresource(
     abspath => :PX_FOLDER || v_name
    ,data    => v_blob
   );

   delete from wwv_flow_files
   where name = :PX_NEWFILE;
  exception
   when others then
    -- Exception-Handling hier!!!
   null;
  end;
end;

Navigieren Sie nun in den Ordner /public/APEX-Test und laden Sie eine Datei hoch. Wenn Sie anschließend mit einem FTP-Client kontrollieren, werden Sie feststellen, dass die Datei nun auch per FTP heruntergeladen werden kann.

DBMS_XDB.CREATERESOURCE kann übrigens nicht nur BLOB als Parameter entgegennehmen, sondern auch VARCHAR2, CLOB oder XMLTYPE. Somit ist es auch möglich, anhand von Tabellen einen Text zusammenzustellen und diesen ins XML DB Repository zu speichern. So können Datenbankinhalte auf einfachstem Weg bereitgestellt werden - lassen Sie mal folgendes Skript im SQL Workshop laufen:

declare
  v_text varchar2(32767);
  v_ret  boolean;
begin
  v_text := '';
  for i in (select owner, table_name from all_tables) loop
    v_text := v_text || '"' || i.owner || '"."' || i.table_name ||'"';
    v_text := v_text || chr(10);
  end loop;
  v_ret := dbms_xdb.createresource(
    abspath => '/public/APEX-Test/ALL_TABLES.txt'
   ,data    => v_text
  );
end;

Laden Sie nun mit einem FTP-Client die Datei /public/APEX-Test/ALL_TABLES.txt herunter und schauen Sie mit einem Texteditor hinein. Sie sollten in etwa folgende Inhalte darin finden:

"SYS"."DUAL"
"SYS"."SYSTEM_PRIVILEGE_MAP"
"SYS"."TABLE_PRIVILEGE_MAP"
"SYS"."STMT_AUDIT_OPTION_MAP"
"SYS"."AUDIT_ACTIONS"
"SYS"."PSTUBTBL"
"SYS"."WRI$_ADV_ASA_RECO_DATA"
"SYS"."ODCI_SECOBJ$"
"SYS"."ODCI_WARNINGS$"
"SYSTEM"."DEF$_TEMP$LOB"
"SYSTEM"."OL$"
"SYSTEM"."OL$HINTS"
"SYSTEM"."OL$NODES"
"SYS"."KU$NOEXP_TAB"
"SYS"."IMPDP_STATS"
"SYS"."PLAN_TABLE$"
"WMSYS"."WM$WORKSPACES_TABLE"
"WMSYS"."WM$VERSION_TABLE"
:

Exkurs: XML

Speziell für XML bietet das XML DB Repository noch weitere, fortgeschrittene Möglichkeiten an: Sie können es ganz hervorragend zum Datenaustausch verwenden. Ein Beispiel: Legen Sie im SQL Workshop folgende View auf die Tabellen EMP und DEPT an:

create or replace view EMP_DEPT_XML of xmltype
with object oid (extract(sys_nc_rowinfo$, '/dept/@id').getNumberVal())
as
select
 XMLroot(
  XMLElement("dept",
   XMLAttributes(d.deptno as "id"),
   XMLElement("dept-name", d.dname),
   XMLElement("dept-location", d.loc),
   XMLElement("dept-employees", (
    select
     XMLAgg(
      XMLElement("employee",
       XMLAttributes(e.empno as "id"),
       XMLForest(
        e.ename as "name", e.job as "job", e.sal as "salary"
       )
      )
     )
     from emp e where e.deptno = d.deptno
    )
   )
  ),
  VERSION '1.0'
 )
from dept d
/

Lassen Sie anschließend folgenden PL/SQL-Block laufen.

declare
  v_result boolean;
begin
  -- Folder "/public/dept-xml" löschen, wenn vorhanden
  begin
   dbms_xdb.deleteresource(
    abspath => '/public/dept-xml',
    delete_option => dbms_xdb.delete_recursive_force
   );
  exception
   when others then null;
  end;
  v_result := dbms_xdb.createfolder(
    abspath => '/public/dept-xml'
  );
  for i in (
    select
     extractvalue(value(d), '/dept/@id') as id,
     ref(d) as reference
    from emp_dept_xml d
  ) loop
    v_result := dbms_xdb.createresource(
      abspath => '/public/dept-xml/department-'||i.id||'.xml',
      data    => i.reference,
      sticky  => false
    );
  end loop;
end;
/

Achten Sie auf die Parameter für die Prozedur DBMS_XDB.CREATERESOURCE . Die XML-Daten aus der View werden nicht direkt, sondern als Pointer (REF) übergeben.

Schauen Sie anschließend per FTP (oder mit Ihrer Anwendung) in den Ordner /public/dept-xml hinein. Sie sollten dort vier Dateien finden. Wenn Sie sich die Dateien jedoch ansehen, finden Sie darin eine XML-Repräsentation der Tabellen EMP und DEPT. Die Daten werden dabei on-the-fly generiert - Probieren Sie es aus: Ändern Sie einige Daten und schauen Sie sich die Daten erneut an ...

XML-Datenaustauch mit dem XML DB Repository

Abbildung 3: XML-Datenaustauch mit dem XML DB Repository

Weitere Funktionen

Daran ist sehr gut erkennbar: Die Einsatzmöglichkeiten für das XML DB Repository sind vielseitig: Neben der Nutzung als Container für Dateien können auch Datenbankinhalte dort abgelegt und für FTP-Zugriffe verfügbar gemacht werden. Neben CREATERESOURCE kennt das Package DBMS_XDB noch einige weitere, wichtige Funktionen und Prozeduren:

PROCEDURE DELETERESOURCE
 Argument Name                  Typ                     In/Out Defaultwert?
 ------------------------------ ----------------------- ------ --------
 ABSPATH                        VARCHAR2                IN
 DELETE_OPTION                  BINARY_INTEGER          IN     DEFAULT

FUNCTION CREATEFOLDER RETURNS BOOLEAN
 Argument Name                  Typ                     In/Out Defaultwert?
 ------------------------------ ----------------------- ------ --------
 ABSPATH                        VARCHAR2                IN

FUNCTION EXISTSRESOURCE RETURNS BOOLEAN
 Argument Name                  Typ                     In/Out Defaultwert?
 ------------------------------ ----------------------- ------ --------
 ABSPATH                        VARCHAR2                IN

PROCEDURE RENAMERESOURCE
 Argument Name                  Typ                     In/Out Defaultwert?
 ------------------------------ ----------------------- ------ --------
 SRCPATH                        VARCHAR2                IN
 DESTFOLDER                     VARCHAR2                IN
 NEWNAME                        VARCHAR2                IN

Spielen Sie ruhig noch ein wenig mit dem XML DB Repository. Mit den genannten Funktionen ist es ein Leichtes, die Anwendung um Möglichkeiten zum Umbenennen oder Löschen von Dateien zu erweitern. Mehr Informationen zum Repository finden Sie hier:

Zurück zur Community-Seite