it-swarm.com.de

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

Ich versuche, in eine Datei zu schreiben, die im Laufwerk c:\mit dem Namen vin1.txt Gespeichert ist, und erhalte diesen Fehler. Bitte schlagen Sie vor!

> ERROR at line 1: ORA-29280: invalid
> directory path ORA-06512: at
> "SYS.UTL_FILE", line 18 ORA-06512: at
> "SYS.UTL_FILE", line 424 ORA-06512: at
> "SCOTT.SAL_STATUS", line 12 ORA-06512:
> at line 1

HIER ist der Code

  create or replace procedure sal_status
   (
    p_file_dir IN varchar2,
    p_filename IN varchar2)
     IS  
    v_filehandle utl_file.file_type;
    cursor emp Is
        select * from employees
        order by department_id;
    v_dep_no departments.department_id%TYPE;
     begin
         v_filehandle :=utl_file.fopen(p_file_dir,p_filename,'w');--Opening a file
         utl_file.putf(v_filehandle,'SALARY REPORT :GENERATED ON %s\n',SYSDATE);
         utl_file.new_line(v_filehandle);
         for v_emp_rec IN emp LOOP
            v_dep_no :=v_emp_rec.department_id;
            utl_file.putf(v_filehandle,'employee %s earns:s\n',v_emp_rec.last_name,v_emp_rec.salary);                    
         end loop;
        utl_file.put_line(v_filehandle,'***END OF REPORT***');
        UTL_FILE.fclose(v_filehandle);
     end sal_status;

execute sal_status('C:\','vin1.txt');--Executing
21
Vineet

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

Die ältere Methode 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 müssen Sie den Verzeichnispfad übergeben ...

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');

UTL_FILE_DIR ist veraltet, weil es von Natur aus unsicher ist: Alle Benutzer haben Zugriff auf alle im Pfad angegebenen Betriebssystemverzeichnisse, während Lese- und Schreibberechtigungen einzelnen Benutzern diskret erteilt werden können. Mit Verzeichnisobjekten können wir Verzeichnisse hinzufügen, entfernen oder ändern, ohne die Datenbank zu aktivieren.

In beiden Fällen muss der Betriebssystembenutzer Oracle über Lese- und/oder Schreibberechtigungen im Betriebssystemverzeichnis verfügen. Falls es nicht offensichtlich ist, bedeutet dies das Verzeichnis muss vom Datenbankserver aus sichtbar sein . Daher können wir keine dieser Methoden verwenden, um ein Verzeichnis auf unserem lokalen PC für einen Prozess bereitzustellen, der auf einem entfernten Datenbankserver ausgeführt wird. Dateien müssen auf den Datenbankserver oder ein freigegebenes Netzlaufwerk hochgeladen werden.


Wenn der Oracle-Betriebssystembenutzer nicht über die entsprechenden Berechtigungen für das Betriebssystemverzeichnis verfügt oder der in der Datenbank angegebene Pfad nicht mit einem tatsächlichen Pfad übereinstimmt, wird das Programm diese Ausnahme auslösen:

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.
35
APC

Vergessen Sie auch nicht, dass sich der Pfad für die Datei auf dem tatsächlichen Oracle-Servercomputer befindet und nicht auf einem lokalen Entwicklungscomputer, der möglicherweise Ihre gespeicherte Prozedur aufruft. Dies ist wahrscheinlich sehr offensichtlich, aber es sollte daran erinnert werden.

6
Josh P

Sie müssen das Verzeichnis bei Oracle registrieren. fopen nimmt den Namen eines Verzeichnisobjekts und nicht den Pfad. Zum Beispiel:

(Möglicherweise müssen Sie sich als SYS anmelden, um diese auszuführen.)

CREATE DIRECTORY MY_DIR AS 'C:\';

GRANT READ ON DIRECTORY MY_DIR TO SCOTT;

Dann können Sie im Aufruf von fopen darauf verweisen:

execute sal_status('MY_DIR','vin1.txt');
4
Jeffrey Kemp

Für utl_file.open (Speicherort, Dateiname, Modus) müssen wir den Verzeichnisnamen als Speicherort angeben, nicht jedoch den Pfad. Beispiel: DATA_FILE_DIR: Dies ist der Verzeichnisname und checken Sie den Verzeichnispfad für diesen bestimmten Verzeichnisnamen aus.

1
sujini

Ihr DBA muss die init.ora-Datei ändern und das Verzeichnis, auf das Sie zugreifen möchten, zum Parameter 'utl_file_dir' hinzufügen. Ihre Datenbankinstanz muss dann angehalten und neu gestartet werden, da init.ora nur gelesen wird, wenn die Datenbank gestartet wird.

Sie können diesen Parameter anzeigen (aber nicht ändern), indem Sie die folgende Abfrage ausführen:

SELECT *
  FROM V$PARAMETER
  WHERE NAME = 'utl_file_dir'

Teile und genieße.

0
Bob Jarvis

Der Verzeichnisname scheint die Groß- und Kleinschreibung zu berücksichtigen. Ich war mit dem gleichen Problem konfrontiert, aber als ich den Verzeichnisnamen in Großbuchstaben angegeben habe, hat es funktioniert.

0
Shafqat Ali