UTL FILE - LEITURA DE ARQUIVO TXT

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
E105826
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 15 Jun 2010 8:29 am
Localização: são paulo - sp

Olá galera tudo bom ?

Estou com uma duvida, pesquisei na internet, inclusive aqui no forum e não localizei nada.

Seguinte, estou fazendo a leitura de um arquivo txt q esta no diretorio X. Até este ponto sem problemas, consigo abrir o arquivo e verificar a primeira linha.

Minha duvida, quando eu leio a primeira linha e populo as devidas variaveis preciso partir para a linha seguinte.
Porém verifiquei, atraves de dbms, que o resultado que ele me tras é sempre o valor da primeira linha.

alguém saberia um comando que diz algo como va para proxima linha ?

segue meu codigo:

Selecionar tudo

declare
	v_arquivo		utl_file.file_type;
	v_origem		varchar2(200)	:=	'/oracle8/banco/trace/bdump';
	v_nome_arquivo		varchar2(50)	:=	'xyz.TXT';

	v_linha			varchar2(32767);
	v_cd_banco			number;
	v_nr_lote			number;
	v_id_registro			number;
	v_ds_cnab_1			varchar2(9);
	v_id_tipo_inscr_empr		number;
	v_nr_inscricao_empresa		number;
	v_id_convenio_banco		varchar2(20);
	v_cd_agencia_mantenedora	number;
	v_id_dig_agencia		varchar2(1);
	v_nr_conta_corrente		number;
	v_id_dig_conta_corrente		varchar(1);
	v_id_dig_conta_agencia		varchar2(1);
	v_nm_empresa			varchar2(30);
	v_nm_banco			varchar2(30);
	v_ds_cnab_2			varchar2(10);
	v_cd_remessa			number;
	v_dt_geracao_arquivo		date;
	v_hr_geracao_arquivo		varchar2(6);
	v_nr_seq_arquivo		number;
	v_nr_vs_layout			number;
	v_nr_densidade_gravacao_arq	number;
	v_ds_reservado_banco		varchar2(20);
	v_ds_reservado_empresa		varchar2(20);
	v_ds_cnab_3			varchar2(29);
	v_registro_anterior		number;                     
	cont				number	:=	0;               

begin
v_arquivo	:=	utl_file.fopen	(v_origem,v_nome_arquivo,'R');

	utl_file.get_line	(v_arquivo,v_linha,240);

	while	cont <= 20	loop
		v_cd_banco			                    := 	    substr(v_linha,1,3); 	    
		v_nr_lote				            :=      substr(v_linha,4,4);	        
		v_id_registro			                    :=      substr(v_linha,8,1);	                            
		v_ds_cnab_1			                    :=	    substr(v_linha,9,9);	     
		v_id_tipo_inscr_empr		            	    :=	    substr(v_linha,18,1); 	   
		v_nr_inscricao_empresa		          	    :=	    substr(v_linha,19,14); 	  
		v_id_convenio_banco		             	    :=	    substr(v_linha,33,20); 	  
		v_cd_agencia_mantenedora		            :=	    substr(v_linha,53,5); 	   
		v_id_dig_agencia			            :=      substr(v_linha,58,1); 	    
		v_nr_conta_corrente		             	    :=	    substr(v_linha,59,12); 	  
		v_id_dig_conta_corrente		         	    :=	    substr(v_linha,71,1); 	   
		v_id_dig_conta_agencia		          	    :=	    substr(v_linha,72,1); 	   
		v_nm_empresa			                    :=      substr(v_linha,73,30); 	   
		v_nm_banco			                    := 	    substr(v_linha,103,30); 	 
		v_ds_cnab_2			                    :=	    substr(v_linha,133,10); 	 
		v_cd_remessa			                    :=      substr(v_linha,143,1); 	   
		v_dt_geracao_arquivo		            	    :=	    substr(v_linha,144,8); 	  
		v_hr_geracao_arquivo		            	    :=	    substr(v_linha,152,6); 	  
		v_nr_seq_arquivo			            :=      substr(v_linha,158,6); 	   
		v_nr_vs_layout			                    := 	    substr(v_linha,164,3); 	  
		v_nr_densidade_gravacao_arq	      		    :=	    substr(v_linha,167,5); 	  
		v_ds_reservado_banco		            	    :=	    substr(v_linha,172,20); 	 
		v_ds_reservado_empresa		          	    :=	    substr(v_linha,192,20); 	 
		v_ds_cnab_3			                    :=	    substr(v_linha,212,29); 	 

Dbms_Output.Put_Line(substr(v_linha,9,9)|| substr(v_linha,18,1)|| substr(v_linha,19,14) ||substr(v_linha,33,20) ||substr(v_linha,53,5)||	substr(v_linha,58,1)||	substr(v_linha,59,12)||	substr(v_linha,71,1)||	substr(v_linha,72,1)||	substr(v_linha,73,30)||	substr(v_linha,103,30)||	substr(v_linha,133,10)||	substr(v_linha,143,1)||	substr(v_linha,144,8)||	substr(v_linha,152,6)||	substr(v_linha,158,6)||	substr(v_linha,164,3)||	substr(v_linha,167,5)||	substr(v_linha,172,20)||	substr(v_linha,192,20)||	substr(v_linha,212,29));
		cont	:=	cont	+	1;
	end	loop;

	utl_file.fclose	(v_arquivo);

exception
	when	others	then
	Dbms_Output.Put_Line(sqlerrm);
	utl_file.fclose_all;

end;

obrigado !!!
senaha.ricardo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 07 Mai 2013 11:35 am

E105826,

eu tb tive esse problema... meu script só lia a 1ª linha...
então criei uma variavel q recebe ela mesma e concatena com a linha do arquivo e termina quando não encontrar mais linhas.
no meu caso, pegava o resultado e salvava em uma tabela q tem uma coluna do tipo CLOB.
ficou desse jeito, no entanto, fiz algumas alterações pra postar aqui...

Selecionar tudo

--CREATE TABLE wt_teste_rs ( X CLOB );
DECLARE
   l_vDir     VARCHAR2(10000) := '/usr/tmp';
   l_fArquivo utl_file.file_type;
   l_vTxt     VARCHAR2(1000) := 'geracao.txt';
   l_vLine    VARCHAR2(4000);
   l_cFile    CLOB;
BEGIN  
   l_fArquivo := utl_file.fopen( l_vDir, l_vTxt, 'R');
   LOOP
     BEGIN
       --
       utl_file.get_line( l_fArquivo, l_vLine );
       l_cFile := l_cFile || l_vLine || chr(10);
       --
     EXCEPTION
       WHEN no_data_found THEN
         EXIT;
     END;
   END LOOP;
   utl_file.fclose(l_fArquivo);
   INSERT INTO wt_teste_rs VALUEs( l_cFile );
END;
vê se isso te ajuda...
E105826
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 15 Jun 2010 8:29 am
Localização: são paulo - sp

Olá pessoal,

hoje com a cabeça mais limpa achei o problema.

Na verdade a minha abertura para pegar a linha esta fora do while, com isso, eu abro a primeiro linha e fico dando um loop nela 20 vezes.

coloquei dentro do while e todas as linhas foram lidas normalmente.

segue como ficou:

Selecionar tudo

	while	v_linha	is	not	null	loop
	    
		utl_file.get_line	(v_arquivo,v_linha);

		Dbms_Output.Put_Line(v_linha);
	end	loop;


Responder
  • Informação
  • Quem está online

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