Oracle
 sql >> Datenbank >  >> RDS >> Oracle

UTL_FILE.FOPEN()-Prozedur akzeptiert keinen Pfad für Verzeichnis?

Seit Oracle 9i gibt es zwei Möglichkeiten, ein Verzeichnis für die Verwendung mit UTL_FILE zu deklarieren.

Der ältere Weg besteht darin, den INIT.ORA-Parameter UTL_FILE_DIR zu setzen. Wir müssen die Datenbank neu starten, damit eine Änderung wirksam wird. Der Wert kann wie jede andere PATH-Variable sein; es akzeptiert Platzhalter. Bei diesem Ansatz muss der Verzeichnispfad...

übergeben werden
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');

Der alternative Ansatz besteht darin, ein Verzeichnisobjekt zu deklarieren.

create or replace directory temp_dir as 'C:\temp'
/

grant read, write on directory temp_dir to vineet
/

Verzeichnisobjekte erfordern den genauen Dateipfad und akzeptieren keine Platzhalter. Bei diesem Ansatz übergeben wir den Verzeichnisobjektnamen...

UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');

Das UTL_FILE_DIR ist veraltet, da es von Natur aus unsicher ist – alle Benutzer haben Zugriff auf alle im Pfad angegebenen Betriebssystemverzeichnisse, während Lese- und Schreibrechte einzelnen Benutzern diskret erteilt werden können. Außerdem können wir mit Verzeichnisobjekten Verzeichnisse hinzufügen, entfernen oder ändern, ohne dass die Datenbank geprellt wird.

In jedem Fall das oracle Der Betriebssystembenutzer muss über Lese- und/oder Schreibrechte für das Betriebssystemverzeichnis verfügen . Falls es nicht offensichtlich ist, bedeutet dies, dass das Verzeichnis vom Datenbankserver aus sichtbar sein muss . Wir können also keinen der beiden Ansätze verwenden, um ein Verzeichnis auf unserem lokalen PC einem Prozess zugänglich zu machen, der auf einem entfernten Datenbankserver ausgeführt wird. Dateien müssen auf den Datenbankserver oder ein freigegebenes Netzlaufwerk hochgeladen werden.

Wenn das oracle Der Betriebssystembenutzer hat nicht die entsprechenden Berechtigungen für das Betriebssystemverzeichnis, oder wenn der in der Datenbank angegebene Pfad nicht mit einem tatsächlichen Pfad übereinstimmt, wird das Programm diese Ausnahme ausgeben:

ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7

Der OERR-Text für diesen Fehler ist ziemlich klar:

29283 -  "invalid file operation"
*Cause:    An attempt was made to read from a file or directory that does
           not exist, or file or directory access was denied by the
           operating system.
*Action:   Verify file and directory access privileges on the file system,
           and if reading, verify that the file exists.