Tipps & Tricks: Juni 2011 Bereich: PL/SQL Erstellung: 06/2011 MP Versionsinfo: 10.x, 11.x Letzte Überarbeitung: 06/2011 MP Verzeichnisse auslesen in PL/SQL 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; Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 3 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 Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 3 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 November 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 PL/SQL II oder DB Reorg & Wartungs-Kurs. Besuchen Sie uns doch mal, wir freuen uns auf Sie ! Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 3