DBMS_LOB.FILEOPEN erro ORA-22285 em caso especifico

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
arthae
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Seg, 09 Mai 2011 1:13 pm
Localização: Porto Alegre - RS
GIVE ME COFFEE AND NO ONE GETS HURT!

Tenho o seguinte procedimento:

Selecionar tudo

  FUNCTION get_local_ascii_data(p_dir  IN VARCHAR2
                               ,p_file IN VARCHAR2) RETURN CLOB IS
    l_bfile BFILE;
    l_data CLOB;
  BEGIN
    dbms_lob.createtemporary(lob_loc => l_data, cache => TRUE, dur => dbms_lob.call);

    l_bfile := bfilename(p_dir, p_file);
    dbms_lob.fileopen(l_bfile, dbms_lob.file_readonly);

    IF dbms_lob.getlength(l_bfile) > 0 THEN
      dbms_lob.loadfromfile(l_data, l_bfile, dbms_lob.getlength(l_bfile));
    END IF;

    dbms_lob.fileclose(l_bfile);

    RETURN l_data;
  END;
A função retorna um CLOB do arquivo que estou passando em parametro.
A função esta sendo chamada da seguinte maneira:

Selecionar tudo

DECLARE
  i CLOB;
  l_bfile BFILE;
  l_data CLOB;
BEGIN

  i := get_local_ascii_data(p_dir => 'DIR_TESTE',
                                       p_file => 'teste_directory.txt');

END;
Onde DIR_TESTE é um directory criado no oracle.
A questão é a seguinte, quando eu executo a chamada original ela esta retornando "ORA-22285: non-existent directory or file for FILEOPEN operation".
Porém se executo da seguinte forma em uma SQL Window ele funciona perfeitamente!

Selecionar tudo

DECLARE
  p_dir VARCHAR2(100) := 'DIR_TESTE';
  p_file VARCHAR2(100) := 'teste_directory.txt';
  l_bfile BFILE;
  l_data CLOB;
BEGIN
  dbms_lob.createtemporary(lob_loc => l_data, cache => TRUE, dur => dbms_lob.call);
  
  l_bfile := bfilename(p_dir , p_file);
  dbms_lob.fileopen(l_bfile, dbms_lob.file_readonly);

  IF dbms_lob.getlength(l_bfile) > 0 THEN
    dbms_lob.loadfromfile(l_data, l_bfile, dbms_lob.getlength(l_bfile));
  END IF;

  dbms_lob.fileclose(l_bfile);

END;
já verifiquei se era grants ou se realmente existe o directory no banco, e não é nenhum dos dois!

Alguém tem alguma dica?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Você citou SQL Window, eu imagino que está usando o PLSQL Developer.
Bom, quando esse tipo de erro doido acontece, eu costumo rodar os programas no SQL*Plus, pois nunca se sabe se o PLSQL Developer está com algum BUG ou mesmo se é algum problema relacionado ao cliente Oracle.

Tente isso direto na base, só pra testar.
Só pra confirmar, você ta usando o mesmo usuário pra fazer tudo certo ?
arthae
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Seg, 09 Mai 2011 1:13 pm
Localização: Porto Alegre - RS
GIVE ME COFFEE AND NO ONE GETS HURT!

Desculpa a demora para responder, é que o problema caiu no esquecimento.

Fiz a mesma coisa no sql*plus e aconteceu o mesmo problema.
Acredito ser configuração de base/servidor só não estou encontrando onde é.
arthae
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Seg, 09 Mai 2011 1:13 pm
Localização: Porto Alegre - RS
GIVE ME COFFEE AND NO ONE GETS HURT!

Fizeram uma copia de um banco de produção para outro servidor de teste.
Ta ocorrendo o mesmo problema só que agora eu consigo debugar.
Verifiquei que o bfilename() não esta encontrando o arquivo quando chamada dentro da função.
arthae
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Seg, 09 Mai 2011 1:13 pm
Localização: Porto Alegre - RS
GIVE ME COFFEE AND NO ONE GETS HURT!

Encontrei o problema, é realmente grant na base de produção.
O que acontecia é que na base de homologação, quando criado o directory com usuário de desenvolvimento o banco atribuia grants para o usuário que estava criando e o SYS.
Porém em produção tudo é implantando com o usuário SYS. Logo ele não liberava grants automaticos.

Me bati para encontrar o problema pois a implantação é feita igual ao que esta nos testes, então como executamos os mesmos comando pensei que seria outro problema.
Mas enfim, obrigado :-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes