Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O procedimento UTL_FILE.FOPEN() não aceita o caminho para o diretório?


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.