Verzeichnisse auslesen in PL/SQL

02.
Juni
2011
Veröffentlicht von: Marco Patzwahl

Bereits seit der Version 10.1 kann man mit einer (undokumentierten) Funktion den Inhalt von Betriebssystemordnern auslesen. Diese Prozedur wird vom RMAN bei folgendem Befehl verwendet:

Bereits seit der Version 10.1 kann man mit einer (undokumentierten) Funktion den Inhalt von Betriebssystemordnern auslesen. Diese Prozedur wird vom RMAN bei folgendem Befehl verwendet:

RMAN> CATALOG START WITH c:\temp;

Hier werden alle Dateien des Ordners c:\temp und auch der Unterordner gelesen und geprüft, ob es sich um eine Oracle-Datei handelt.

Die folgende PL/SQL-Prozedur liest nur den Inhalt des Ordners c:\temp aus:

SET SERVEROUTPUT ON
DECLARE
   ns    VARCHAR2(1024);
   v_dir VARCHAR2(1024):='c:\temp';
BEGIN
   DBMS_BACKUP_RESTORE.SEARCHFILES(v_dir, ns);
   FOR r IN (SELECT fname_krbmsft as name FROM x$krbmsft) LOOP
      DBMS_OUTPUT.PUT_LINE(r.name);
   END LOOP;
END;
/

Ergibt z. B. die Ausgabe:

C:\Temp\dozent2_tuning.txt
C:\Temp\perl_test.pl
C:\Temp\Muniqsoft_Backup.7z

Leider darf nur der Benutzer SYS dieses Package ausführen. Wenn auch ein anderer Benutzer in den Genuss dieser Prozedur kommen soll, stehen zwei Varianten zur Verfügung:

1. Variante: Der Benutzer bekommt ein Ausführungsrecht an diesem Package.

Der Nachteil dieser Variante ist, dass dieses Package zwar viele interessante aber auch gefährliche Nutzungsmöglichkeiten bietet.

GRANT EXECUTE ON DBMS_BACKUP_RESTORE TO SYSTEM;

Danach muss (im Schema SYS!) eine View auf die fixed table x$krbmsft erstellt werden (Selectrechte an Fixed Tables können nicht direkt vergeben werden):

CREATE VIEW sys.x$krbmsft_muso_view AS SELECT * FROM sys.x$krbmsft;

Der User SYSTEM bekommt das Select-Recht auf diese View:

GRANT SELECT ON sys.x$krbmsft_muso_view TO SYSTEM;

Jetzt kann man sich als SYSTEM anmelden und schreibt die Prozedur etwas um:

SET SERVEROUTPUT ON
DECLARE
    ns   VARCHAR2(1024);
   v_dir VARCHAR2(1024):= 'c:\temp';
BEGIN
   SYS.DBMS_BACKUP_RESTORE.SEARCHFILES(v_dir, ns);
   FOR r IN (SELECT fname_krbmsft as name FROM sys.x$krbmsft_muso_view) LOOP
     DBMS_OUTPUT.PUT_LINE(r.name);
   END LOOP;
END;
/


2. Variante: Wir schreiben einen Wrapper um den Package-Aufruf, der uns nur ermöglicht, diese eine Prozedur des Packages zu nutzen:

CREATE OR REPLACE PROCEDURE sys.muso_backup_restore_sfiles(
     v_dir IN OUT VARCHAR2,
     ns       OUT VARCHAR2)
IS
BEGIN
   DBMS_BACKUP_RESTORE.SEARCHFILES(v_dir, ns);
END;
/

Dann vergeben wir nur ein Ausführungsrecht an der Prozedur (nicht mehr am kompletten Package!):

GRANT EXECUTE ON sys.muso_backup_restore_sfiles TO SYSTEM;
REVOKE EXECUTE ON DBMS_BACKUP_RESTORE FROM SYSTEM;

connect system/sys
SET SERVEROUTPUT ON
DECLARE
      ns VARCHAR2(1024);
   v_dir VARCHAR2(1024):='c:\temp';
BEGIN
   sys.muso_backup_restore_sfiles(v_dir, ns);
   FOR r IN ( SELECT fname_krbmsft as name FROM sys.x$krbmsft_muso_view) LOOP
       DBMS_OUTPUT.PUT_LINE(r.name);
   END LOOP;
END;
/

Diese Prozedur bietet viele Einsatzmöglichkeiten, z. B.:

  • Ein komplettes Verzeichnis (mit Bildern, PDF's oder Word Dokumenten) in BLOB Feldern speichern... (s. Monatstipp vom <link blog-detailansicht import-von-bild-dateien-in-die-datenbank.html external-link-new-window external link in new>Opens external link in new windowNovember 2009).
  • Ordner per FTP in die (in jeder Oracle-Version vorhanden) XML-Datenbank hochladen.
  • Prüfen, ob neue Dateien in einem Betriebssystem-Ordner vorhanden sind, und diese mit utl_file oder External Table einlesen.

Diese und weitere Beispiele lernen Sie u. a. in unserem Opens internal link in current windowPL/SQL II oder DB Reorg & Wartungs-Kurs.
Besuchen Sie uns doch mal, wir freuen uns auf Sie !

PL/SQL

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.