Il primo problema è che probabilmente il percorso non esiste o non hai privilegi di scrittura sulla directory.
SQL> select directory_path from all_directories where directory_name = 'YOUR DIRECTORY' ;
Se non hai righe, devi affrontarlo con il tuo DBA, poiché la directory non esiste o non hai privilegi su di essa. Una directory di database è una combinazione di due elementi:
- La directory del database è un puntatore o un riferimento a una posizione nel sistema operativo.
- Il percorso di quella directory deve esistere e l'utente che esegue il processo deve possedere i privilegi di lettura e scrittura su di essa.
Per il secondo problema, il problema è che all'utente proprietario della procedura non è stato concesso il privilegio di sistema CREATE ANY DIRECTORY. Il tuo DBA deve concedere il privilegio CREATE ANY DIRECTORY sul tuo utente, anche se non lo consiglio. Concedere QUALSIASI privilegio è una cattiva pratica di sicurezza.
La creazione di directory è normalmente un compito per il tuo DBA. Non prevedo uno scenario in cui è necessario crearli dinamicamente, a patto di creare anche la directory sottostante nell'unità Filesystem (Linux) o Windows, a seconda del proprio sistema operativo.
Date le tue circostanze speciali, non hai alcuna opzione al riguardo. Devi rivalutare la soluzione. Forse potresti usare WRITETOCLOB invece di WRITETOFILE , quindi eseguire lo spool del risultato sul lato client tramite sqlplus invece