DIRECTORY erro de operação de arquivo inválida

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Petermann
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Jan 2009 2:26 pm
Localização: Brusque - SC
Alexandre Petermann

Amigos, estou com um problema,
até o momento sempre trabalhei com o UTL_FILE_DIR para a exportação de arquivos pelo DB, até ai tudo certo, 100%.

Mas em um cliente o dba instalou o oracle 11g, segue:

Selecionar tudo

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE	11.2.0.1.0	Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
Dai ele me passou que:
Isso mudou no Oracle 11g, eles vão ter que criar um diretório no banco de dados via CREATE DIRECTORY e pesquisar como é feito agora.
O parametro que o Alexandre viu não serve mais, só em mantido pra efeito de compatibilidade com versões anteriores do banco;


Fiz os procedimento que esse artigo orientou:
http://eduardolegatti.blogspot.com/2009 ... lob-e.html

Verifiquei se o parâmetro esta ok, conforme codigo:

Selecionar tudo

SQL> select * from dba_directories;

OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------------------------------------------------
SYS                            ORACLE_OCM_CONFIG_DIR          /oracle/product/11.2.0/ccr/state
SYS                            DATA_PUMP_DIR                  /oracle/admin/orcl2/dpdump/
SYS                            ARQUIVO_DIR                    /home/setores/nfe
SYS                            UTL_FILE                       /home/setores/nfe

Selecionar tudo

SQL> select grantor, grantee, table_name, privilege
  2    from all_tab_privs
  3   where table_name = 'ARQUIVO_DIR';

GRANTOR                        GRANTEE                        TABLE_NAME                     PRIVILEGE
------------------------------ ------------------------------ ------------------------------ ----------------------------------------
SYS                            TECTEXTIL                      ARQUIVO_DIR                    EXECUTE
TECTEXTIL                      PUBLIC                         ARQUIVO_DIR                    READ
SYS                            TECTEXTIL                      ARQUIVO_DIR                    READ
TECTEXTIL                      PUBLIC                         ARQUIVO_DIR                    WRITE
SYS                            TECTEXTIL                      ARQUIVO_DIR                    WRITE
Para teste estou executando essa rotina mais simples:

Selecionar tudo

declare
  v_arquivo utl_file.file_type;
begin
  v_arquivo := utl_file.fopen('ARQUIVO_DIR', 'arq_teste.txt', 'W');
  utl_file.put_line(v_arquivo, 'linha 1');
  utl_file.put_line(v_arquivo, 'linha 2');
  utl_file.put_line(v_arquivo, 'linha 3');
  utl_file.put_line(v_arquivo, 'linha 4');
  utl_file.put_line(v_arquivo, 'linha 5');
  utl_file.fclose(v_arquivo);
exception
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(sqlerrm);
    UTL_FILE.FCLOSE(v_arquivo);
end;
Mesmo assim esta dando o seguinte erro:

Selecionar tudo

ORA-29283: operação de arquivo inválida
ORA-06512: em "SYS.UTL_FILE", line 536
ORA-29283: operação de arquivo inválida

Alguém tem alguma sugestão?
sera que o parâmetro utl_file_dir tem que estar com permissão também de gravação?

Abraço!
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

cara tive esse problema tb... resolvi da seguinte forma:

Criando o Directory na mesma pasta do utl_file_dir ou seja: /home/setores/nfe;


Ai consegui ler os arquivos e gravar.

Att,

Diego Monteiro
Petermann
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Jan 2009 2:26 pm
Localização: Brusque - SC
Alexandre Petermann

Pois é Diego,
pedi para o DBA habilitar o utl_file, conforme o codigo abaixo, mas mesmo assim continua a mesma coisa, dando erro:

Selecionar tudo

SQL> show parameter utl_file;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      *
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

No utl_file_dir você coloca isso:

Selecionar tudo

/home/setores/nfe
Ai você tenta enxergar os arquivos na pasta nfe que vai funcionar.

Att,

Diego Monteiro
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

Executa esse comando vê se ele está achando o diretório:

Crie um arquivo texto lá na pasta e vê se ele acha o mesmo com o comando abaixo:

Selecionar tudo

SELECT FNAME_KRBMSFT AS name FROM SYS.XKRBMSFT WHERE FNAME_KRBMSFT LIKE '%.txt%';
Att,

Diego Monteiro
Petermann
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Jan 2009 2:26 pm
Localização: Brusque - SC
Alexandre Petermann

Diego, fiz conforme você falou, mas apresentou o seguinte erro:

Selecionar tudo

SQL> SELECT FNAME_KRBMSFT AS name FROM SYS.XKRBMSFT WHERE FNAME_KRBMSFT LIKE '%.txt%';

SELECT FNAME_KRBMSFT AS name FROM SYS.XKRBMSFT WHERE FNAME_KRBMSFT LIKE '%.txt%'

ORA-00942: a tabela ou view não existe
Tens alguma idéia o que pode ser?
abraço
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

Peter,


Estou encaminhando a proc que tenho aqui no 11g e só salientando o meu directory é o mesmo do UTL_FILE_DIR, blza?

Selecionar tudo

CREATE OR REPLACE PROCEDURE NFE.NFE_IOB (DT_INICIAL IN DATE)
IS

vLinha VARCHAR2(4000);
vFilekey            UTL_FILE.FILE_TYPE;

BEGIN
 
  BEGIN
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = ''AMERICAN''';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ''.,''';
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY''';
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END;
      
      vFilekey := UTL_FILE.FOPEN('D:\CSCORP\',  'IOB_'||TO_CHAR(DT_INICIAL, 'DDMMYYYY')||'-'||TO_CHAR(LAST_DAY(DT_INICIAL), 'DDMMYYYY')||'.txt', 'W', 32000);
  
      FOR X IN (SELECT C.CNPJ_EMPRESA||
                       C.mês||
                       COUNT(*) AS LINHA
                  FROM
                (SELECT A.ID_NF,
                       B.CNPJ_EMPRESA,
                       TO_CHAR(TO_DATE(A.DT_OCORRENCIA, 'DD/MM/YYYY'), 'YYYYMM') AS mês,
                       ROW_NUMBER () OVER (PARTITION BY ID_NF ORDER BY ID_NF) AS MELHOR_LINHA       
                  FROM NFE_OCORR_IOB_PRIMEO A,
                       CTRL_EMPRESA B
                 WHERE A.ID_EMPRESA = B.ID_EMPRESA
                   AND TO_DATE(A.DT_OCORRENCIA, 'DD/MM/YYYY') BETWEEN TO_DATE(DT_INICIAL, 'DD/MM/YYYY')
                                                                AND LAST_DAY(TO_DATE(DT_INICIAL, 'DD/MM/YYYY'))) C
                  WHERE C.MELHOR_LINHA = 1
                  GROUP BY C.CNPJ_EMPRESA,
                       C.mês)
     LOOP
       BEGIN            
        vLinha:= x.LINHA;       
       END;
       
       UTL_FILE.PUT_LINE(vFilekey, vLinha);
       
     END LOOP;                                         
     
       UTL_FILE.FCLOSE(vFilekey);
       
     COMMIT;
     
EXCEPTION
      WHEN UTL_FILE.INVALID_OPERATION THEN
               Dbms_Output.Put_Line('Operação inválida no arquivo.');
               UTL_File.Fclose(vFilekey);
      WHEN UTL_FILE.WRITE_ERROR THEN
               Dbms_Output.Put_Line('Erro de gravação no arquivo.');
               UTL_File.Fclose(vFilekey);
      WHEN UTL_FILE.INVALID_PATH THEN
               Dbms_Output.Put_Line('Diretório inválido.');
               UTL_File.Fclose(vFilekey);
      WHEN UTL_FILE.INVALID_MODE THEN
               Dbms_Output.Put_Line('Modo de acesso inválido.');
               UTL_File.Fclose(vFilekey);
      WHEN UTL_FILE.invalid_maxlinesize THEN
               Dbms_Output.Put_Line('Tamanho da linha inválido');
               UTL_File.Fclose(vFilekey);
      WHEN Others THEN
               Dbms_Output.Put_Line('Problemas na geração do arquivo.' );
               UTL_File.Fclose(vFilekey);

END NFE_IOB;
/

Espero ter ajudado.

Att,

Diego Monteiro
Petermann
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Jan 2009 2:26 pm
Localização: Brusque - SC
Alexandre Petermann

Amigos, o problema erra de permissão do linux para aonde podia gravar arquivo, estava em:
/home/setores/nfe
foi colocado em:
/nfe

e dado as permissões e tudo funcionou normalmente.

Obrigado pela atenção
Responder
  • Informação