Procedure UTL_FILE gravando em um diretório Linx.
Hoje precisei atender um cliente que estava com o seguinte erro:
ERROR at line 1:
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at "SYS.DIR_TESTE", line 10
ORA-06512: at line 1
Para validar se era algum coisa no S.O. ou de permissão no Oracle, criei uma procedure. Criei um diretorio virtual chamado DIR_TESTE, no diretorio: /teste
SYS@db2 > CREATE OR REPLACE DIRECTORY DIR_TESTE AS '/teste';
Criei uma procedure para teste a gravação nesse diretorio.
SYS@db2 > CREATE OR REPLACE PROCEDURE DIR_TESTE
IS
l_file UTL_FILE.file_type;
l_file_name VARCHAR2 (60);
BEGIN
SELECT 'KY' || TO_CHAR (SYSDATE, 'yyyymmdd') || '1.txt'
INTO l_file_name
FROM DUAL;
l_file := UTL_FILE.fopen ('DIR_TESTE', l_file_name, 'w');
UTL_FILE.putf (l_file, l_file_name);
UTL_FILE.fclose (l_file);
END DIR_TESTE;
/
Depois executei a procedure com sucesso!
exec DIR_TESTE;
PL/SQL procedure successfully completed.
SYS@db2 > !ls
KY202003181.txt
No caso o erro no cliente era que o UTL_FILE estava chamando o Diretorio virtual em minusculo.
l_file := UTL_FILE.fopen ('dir_teste', l_file_name, 'w');
-- Foi corrigido para:
l_file := UTL_FILE.fopen ('DIR_TESTE', l_file_name, 'w');
Abs