Als PDF Downloaden!

Werbung
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
Herunterladen