Desde o Oracle 9i existem duas maneiras de declarar um diretório para uso com UTL_FILE.
A maneira mais antiga é definir o parâmetro INIT.ORA UTL_FILE_DIR. Temos que reiniciar o banco de dados para que uma alteração tenha efeito. O valor pode ser igual a qualquer outra variável PATH; ele aceita curingas. Usar essa abordagem significa passar o caminho do diretório...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
A abordagem alternativa é declarar um objeto de diretório.
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
Os objetos de diretório exigem o caminho exato do arquivo e não aceitam curingas. Nesta abordagem, passamos o nome do objeto de diretório...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
O UTL_FILE_DIR está obsoleto porque é inerentemente inseguro - todos os usuários têm acesso a todos os diretórios do SO especificados no caminho, enquanto os privilégios de leitura e gravação podem ser concedidos discretamente a usuários individuais. Além disso, com objetos de diretório, podemos adicionar, remover ou alterar diretórios sem saltar o banco de dados.
Em ambos os casos, o
oracle
O usuário do SO deve ter privilégios de leitura e/ou gravação no diretório do SO . Caso não seja óbvio, isso significa que o diretório deve estar visível no servidor de banco de dados . Portanto, não podemos usar nenhuma das abordagens para expor um diretório em nosso PC local a um processo em execução em um servidor de banco de dados remoto. Os arquivos devem ser carregados no servidor de banco de dados ou em uma unidade de rede compartilhada. Se o
oracle
O usuário do sistema operacional não possui os privilégios apropriados no diretório do sistema operacional ou, se o caminho especificado no banco de dados não corresponder a um caminho real, o programa lançará esta exceção:ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
O texto OERR para este erro é bastante claro:
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.