Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

filipescoob

Importar dados de TXT

Recommended Posts

Galera como importo dados de um txt localizado no C:\ da maquina para dentro do banco via programação. Alguem tem algum codigo para realizar este procedimento. Tentei fazer algo aqui mas até agora não saiu nda.

 

Segue o que tenho abaixo

 

PROCEDURE PROC_PROCESSA_ARQUIVO
	(
	  pStrNomeArquivo IN VARCHAR2
	) IS

 


/* Declaração de Variáveis */

 

	vFilOrigem  UTL_FILE.FILE_TYPE;
	vStrBuffer  VARCHAR2(1000) := null;
	V_CPF_CNPJ VARCHAR2(14) := null,
	V_TIPO_PESSOA CHAR(1) := null,
	V_SITUACAO CHAR(1) := null,
	V_CPF_RESPONSAVEL VARCHAR2(14) := null,
	V_DATA_INCLUSAO DATE := null,
	V_NOME  VARCHAR2(137) := null

 

	INVALID_LENGTH  EXCEPTION;
	INVALID_FORMAT  EXCEPTION;

 

	--Variáveis de controle
	vNumLinha				 NUMBER(10,0) :=0;
	vNumQtdePlanos			NUMBER(10,0) :=0;
	vQtdeIncluidoPlano		NUMBER(10,0) :=0;
	vQtdeAlteradoPlano		NUMBER(10,0) :=0;
	vQtdeExcluidoPlano		NUMBER(10,0) :=0;
	vQtdeIncluidoModal		NUMBER(10,0) :=0;
	vQtdeAlteradoModal		NUMBER(10,0) :=0;
	vQtdeExcluidoModal		NUMBER(10,0) :=0;
	vNumQtdeErros			 NUMBER(10,0) :=0;
	vNumQtdeMod			   NUMBER(10,0) :=0;
	vNumQtdePlanoMod		  NUMBER(10,0) :=0;
	vNumRegIgnorados		  NUMBER(10,0) :=0;
	vNumQtdeForaLayout		NUMBER(10,0) :=0;
	vBolErroLinha			 BOOLEAN;
	vBolErroClasse			BOOLEAN;
	var_saidaint			  INT := 0;

 
BEGIN

  SELECT UTLDIR into cStrPath FROM TB_CIPEX_UTLFILE;
  vNumQtdePlanos := 0;

 

  IF FUNC_FILE_EXISTS(cStrPath,pStrNomeArquivo) THEN
	vFilOrigem := UTL_FILE.FOPEN(cStrPath,pStrNomeArquivo,'r');

 

	<<inicio_loop>>----------------------------------------------------------------------------------------------------
	LOOP
		vBolErroLinha := FALSE;
		vBolErroClasse := FALSE;

 

		<<line_read>> ----------------------------------------------------------------------------------------------------
		BEGIN
			UTL_FILE.GET_LINE(vFilOrigem,vStrBuffer);

 

			vNumLinha := vNumLinha + 1;

 


			<<string_split>> --------------------------------------------------------------------------------------------------
			BEGIN


				--Lê e quebra a linha do arquivo dentro das variáveis
				V_CPF_CNPJ			 := RTrim(FUNC_SPLIT_STRING(vStrBuffer,';',1));
				V_TIPO_PESSOA			  := RTrim(FUNC_SPLIT_STRING(vStrBuffer,';',2));
				V_SITUACAO		  := RTrim(FUNC_SPLIT_STRING(vStrBuffer,';',3));
				V_CPF_RESPONSAVEL			:= RTrim(FUNC_SPLIT_STRING(vStrBuffer,';',4));
				V_DATA_INCLUSAO		   := RTrim(FUNC_SPLIT_STRING(vStrBuffer,';',5));
				V_NOME		  := RTrim(FUNC_SPLIT_STRING(vStrBuffer,';',6));

			EXCEPTION
				WHEN OTHERS THEN
--					vBolErroLinha := TRUE;
					vNumQtdeForaLayout := vNumQtdeForaLayout + 1;
					GOTO inicio_loop;

 

				   -- IF vNumQtdeErros < 20 THEN
				   --	 DBMS_OUTPUT.PUT_LINE(RPAD(' line_error:string_split',30) || ' line ' || vNumLinha ||  '-' || SQLERRM);
				   -- END IF;
			END string_split; ----------------------------------------------------------------------------------------------------

 

		END line_read; ----------------------------------------------------------------------------------------------------

	End loop;


END PROC_PROCESSA_ARQUIVO;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se este codigo possa lhe ajudar.

substituir a linha do substr(...).

substituir também :teste pelo diretorio.

 

Abraço

 

PROCEDURE PR_IMPORTAR IS

V_ARQ_TXT TEXT_IO.FILE_TYPE;

V_LINHA_TXT VARCHAR2(300) := NULL;

V_CONTA NUMBER := 0;

V_TOTAL NUMBER := 0;

BEGIN

 

V_ARQ_TXT := TEXT_IO.FOPEN(:TESTE.ARQUIVO, 'R');

 

BEGIN

LOOP

TEXT_IO.GET_LINE(V_ARQ_TXT, V_LINHA_TXT);

TEXT_IO.NEW_LINE;

INSERT INTO TESTE

( CODIGO,

NOME,

ENDERECO)

VALUES

(SUBSTR(V_LINHA_TXT,01,03),

SUBSTR(V_LINHA_TXT,04,10),

SUBSTR(V_LINHA_TXT,11,140));

IF V_CONTA > 1000 THEN

:SYSTEM.MESSAGE_LEVEL := 10;

COMMIT;

:SYSTEM.MESSAGE_LEVEL := 0;

V_CONTA := 0;

ELSE

V_CONTA := V_CONTA + 1;

END IF;

V_TOTAL := V_TOTAL + 1;

MESSAGE('REGISTROS : '||TO_CHAR(V_TOTAL),NO_ACKNOWLEDGE);

SYNCHRONIZE;

END LOOP;

EXCEPTION WHEN NO_DATA_FOUND THEN

TEXT_IO.PUT_LINE('Closing the file...');

TEXT_IO.FCLOSE(V_ARQ_TXT);

END;

:SYSTEM.MESSAGE_LEVEL := 10;

COMMIT;

:SYSTEM.MESSAGE_LEVEL := 0;

SYNCHRONIZE;

END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fica a gosto do freguÊs agora... pode utilizar tanto o SQL*LOADER como o UTL_FILE.

 

Porém, o SQL*LOADER é 1000x mais rápido que o UTL!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.