Oracle
 sql >> Database >  >> RDS >> Oracle

La procedura UTL_FILE.FOPEN() non accetta il percorso per la directory?

Da Oracle 9i ci sono due modi per dichiarare una directory da utilizzare con UTL_FILE.

Il metodo precedente consiste nell'impostare il parametro INIT.ORA UTL_FILE_DIR. Dobbiamo riavviare il database affinché una modifica abbia effetto. Il valore può essere come qualsiasi altra variabile PATH; accetta caratteri jolly. Usare questo approccio significa passare il percorso della directory...

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

L'approccio alternativo consiste nel dichiarare un oggetto directory.

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

grant read, write on directory temp_dir to vineet
/

Gli oggetti directory richiedono il percorso del file esatto e non accettano caratteri jolly. In questo approccio passiamo il nome dell'oggetto directory...

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

UTL_FILE_DIR è deprecato perché intrinsecamente non sicuro:tutti gli utenti hanno accesso a tutte le directory del sistema operativo specificate nel percorso, mentre i privilegi di lettura e scrittura possono essere concessi in modo discreto ai singoli utenti. Inoltre, con gli oggetti Directory possiamo aggiungere, rimuovere o modificare directory senza far rimbalzare il database.

In entrambi i casi, l'oracle L'utente del sistema operativo deve disporre dei privilegi di lettura e/o scrittura sulla directory del sistema operativo . Nel caso non sia ovvio, questo significa la directory deve essere visibile dal server del database . Quindi non possiamo utilizzare nessuno dei due approcci per esporre una directory sul nostro PC locale a un processo in esecuzione su un server di database remoto. I file devono essere caricati sul server del database o su un'unità di rete condivisa.

Se l'oracle L'utente del sistema operativo non dispone dei privilegi appropriati sulla directory del sistema operativo, oppure se il percorso specificato nel database non corrisponde a un percorso effettivo, il programma lancerà questa eccezione:

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

Il testo OERR per questo errore è abbastanza chiaro:

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.