Abrir vários arquivos para leitura

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
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Olá pessoal,

Usando UTL_FILE, eu preciso abrir vários arquivos (que são packages) ao mesmo tempo, e não apenas um por um. Como eu faço isso?

Pensei em colocar o comando de abertura dentro de um loop (segue um exemplo abaixo).

Selecionar tudo

PROCEDURE TESTE(
, p_dir IN VARCHAR2 -- diretório
, p_arq IN VARCHAR2 -- arquivos
IS

  .... -- declaração de variáveis auxiliares ...
  BEGIN
    LOOP
      v_arq := UTL_FILE.FOPEN(p_dir,p_arq,'r');
  ........

END TESTE;
Esta solução é válida?
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

Se for ao mesmo tempo, creio que você terá que abrir usando outra variável, tipo:

Selecionar tudo

  v_arq1 := UTL_FILE.FOPEN(p_dir1,p_arq1,'r');
  v_arq2 := UTL_FILE.FOPEN(p_dir2,p_arq2,'r');
(eu não consegui testar aqui), mas se der certo, avisa a galera!!!
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Gori, não pode ser desse jeito, pois, eu teria que mandar abrir, por exemplo, 500 arquivos, e eu não poderia usar o artifício de "hardcode" e declarar 500 variáveis e abrir 500 arquivos um por um.

Eu recebi uma outra sugestão: Criar uma tabela para armazenar o nome de todos os arquivos, e depois percorrer essa tabela (abrindo os arquivos) via cursor.

Essa alternativa também é viável? alguém teria uma outra sugestão?

Obrigado pela resposta dr_gori :D
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP
Julian de A. Campagnoli
Treinee, Desenvolvedor Oracle PL-SQL

E aeee tudo bem,

Pelo pouco que conheço do pacote UTL_FILE infelizmente ele não possui função capaz de abrir mais de um arquivo.

Sintaxe :

Selecionar tudo

utl_file.fopen(
     <file_location    IN VARCHAR2>, 
     <file_name       IN VARCHAR2>,  
     <open_mode    IN VARCHAR2>, 
     <max_linesize  IN BINARY_INTEGER>)
RETURN <file_type_package_data_type;
Se realmente não for viavel fazer conforme o dr.gori disse.

Acredito é uma opção válida criar uma tabela e utilizar o cursor para obter os registros.

só por curiosidade, porque você precisa abrir tantos arquivos assim simultaneamente ???????

Abraço
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

E por que não usar collection com os nomes dos arquivos como parâmetro, e perecorrêla em um loop, abrindo os arquivos (considerando que não seja necessário que mais de um arquivo seja aberto ao mesmo tempo, caso contraário, crie uma table de utl_file.file_type, indexada da mesma maneira que o parâmetro de entrada)..
+- assim (desculpe, mas estou meio sem tempo de elaborar melhor a resposta)

Selecionar tudo

declare
 type arquivos_t is table of utl_file.file_type index by binary_integer;
 t_arq arquivos_t;

 type nom_arquivo_t is table of varchar2 index by binary_integer;
 t_nom_arq nom_arquivo_t;
begin

 -- Inicializando a collection com os nomes dos arquivos..
 for x in 1 .. 5 loop
  t_nom_arq(x) := 'ARQUIVO'||x||'.sql';
 end loop;

 -- Abrindo os arquivos...
 for x in t_nom_arq.first .. t_nom_arq.last loop
  t_arq(x) := utl_file.fopen('/dir', t_nom_arq(x), 'R');
 end loop;

  -- ...
  -- aqui você fará a manipulação desejada sobre os arquivos
  -- ...

 -- Fechando os arquivos e limpando as collections usadas.
 for x in t_nom_arq.first .. t_nom_arq.last loop
  utl_file.fclose (t_arq(x));
 end loop;

  t_arq.delete;
  t_nom_arq.delete;

end;

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

Outra forma, talvez seja usar external table...
Dá uma procurada aqui no forum sobre isso.
Tem esse link:
http://glufke.net/oracle/viewtopic.php?t=2789
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Obrigado a todos pelas respostas !!

Rafael, porque você usou isso :

Selecionar tudo

-- Inicializando a collection com os nomes dos arquivos.. 
 for x in 1 .. 5 loop 
Porque esse x de 1 até 5? o 5 seria, por exemplo o número de arquivos a abrir?
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Sim, foi apenas um exemplo para ter algo na collection (no seu caso, acredito que esta variável seria um parâmetro passado à sua procedure)
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Sobre o código da collection nessa parte:

Selecionar tudo

type nom_arquivo_t is table of varchar2 index by binary_integer;
Está dando o seguinte erro no oracle:
String lenght constraints must be in range (1... 32767)
Será que esse erro não tem a ver com a "table of varchar2", pois o cursor fica ao lado dessa expressão quando o erro acontece.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Jackie, tudo bem?

Este erro foi devido não especificação do tamanho do teu varchar2.

Faça um teste com este código:

Selecionar tudo

type nom_arquivo_t is table of varchar2(1000) index by binary_integer;
Você pode trocar o "1000" pelo valor que você deseja, ok?

qualquer coisa, manda pra gente.
Responder
  • Informação
  • Quem está online

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