Das erste Problem ist, dass der Pfad wahrscheinlich nicht existiert oder Sie keine Schreibrechte für das Verzeichnis haben.
SQL> select directory_path from all_directories where directory_name = 'YOUR DIRECTORY' ;
Wenn Sie keine Zeilen erhalten, müssen Sie dies mit Ihrem DBA besprechen, da das Verzeichnis entweder nicht existiert oder Sie keine Berechtigungen dafür haben. Ein Datenbankverzeichnis ist eine Kombination aus zwei Elementen:
- Das Datenbankverzeichnis ist ein Zeiger oder Verweis auf einen Speicherort im Betriebssystem.
- Der Pfad dieses Verzeichnisses muss existieren und der Benutzer, der den Prozess ausführt, muss Lese- und Schreibrechte dafür besitzen.
Beim zweiten Problem besteht das Problem darin, dass dem Benutzer, dem die Prozedur gehört, nicht das Systemprivileg CREATE ANY DIRECTORY erteilt wurde. Ihr DBA muss Ihrem Benutzer das CREATE ANY DIRECTORY-Privileg erteilen, obwohl ich es nicht empfehle. IRGENDEINE Berechtigungen zu gewähren ist eine schlechte Sicherheitspraxis.
Das Erstellen von Verzeichnissen ist normalerweise eine Aufgabe für Ihren DBA. Ich sehe kein Szenario, in dem Sie sie dynamisch erstellen müssen, solange Sie je nach Betriebssystem auch das zugrunde liegende Verzeichnis im Dateisystem (Linux) oder Windows-Laufwerk erstellen müssen.
Angesichts Ihrer besonderen Umstände haben Sie hier keine andere Wahl. Sie müssen die Lösung neu bewerten. Vielleicht könnten Sie WRITETOCLOB anstelle von WRITETOFILE verwenden und das Ergebnis dann stattdessen von sqlplus auf Ihrer Client-Seite spoolen