Ir para conteúdo

POWERED BY:

Arquivado

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

Faccruz

Exportar dados para TXT

Recommended Posts

boa tarde,

 

Preciso criar uma procedure que exporte os dados de uma tabela (apenas os dados) Oracle para um arquivo TXT com os campos delimitados por ; (ponto-e-virgula)?

Procurei aqui no forum e não encontrei nada....

Compartilhar este post


Link para o post
Compartilhar em outros sites

A package que faz isto (manipular arquivos) é a sys.utl_file.

 

Deve ter milhares de exemplos dela na Web e talvez até uma solução pronta para você.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela ajuda. consegui resolver. Para aqueles que precisarem segue a procedure.

 

create or replace procedure CYBELAR_EXP_TXT_NRSORTE is
  /****************************************************************
  * PROCEDURE : CYBELAR_EXP_TXT_NRSORTE						   *
  * OBJETIVO  : Exporta dados de uma tabela para um arquivo texto *
  * CRIACAO   : 19/05/2009										*
  * VERSAO	: 1.0											   *
  * AUTOR	 : FABIO A. CAMPOS DA CRUZ -	*
  ****************************************************************/

  -----------------------------------------------------
  -- DECLARACAO DE VARIAVEIS P/ CONTROLE DO PROCESSO --
  -----------------------------------------------------
  ARQ_NRSORTE UTL_FILE.file_type;
  VC_LINHA	VARCHAR2(8000) := NULL;
  VC_ARQ_NOME VARCHAR2(100) := NULL;
  VC_DIR_LOG  VARCHAR2(50) := NULL;
  VC_DIR_OUT  VARCHAR2(50) := NULL;
  VG_PROCESSO VARCHAR2(100) := 'CYBELAR_EXP_TXT_NRSORTE';

  ------------------------------------
  -- CURSOR PARA GERACAO DO ARQUIVO --
  ------------------------------------
  CURSOR CUR_NRSORTE IS
	SELECT NROSORTE,
		   LOJA,
		   MES_ANO,
		   CPF,
		   NOMCLI,
		   TELCLI,
		   PDV_CAIXA,
		   CODPRODSORT,
		   SERIESORTEIO,
		   NUMOPERADOR,
		   VLRTRANSACAO,
		   CODCLIENTE
	  FROM CYBELAR_NROSORTE
	 WHERE CPF IS NOT NULL
	 AND TO_CHAR(DATANRSORTE, 'YYMMDD') = TO_CHAR(SYSDATE, 'YYMMDD');

begin
  ---------------------
  -- BUSCA DIRETORIO --
  ---------------------
  BEGIN
	SELECT PINT_NM_DIRETORIO_LOG, PINT_NM_DIRETORIO_OUT
	  INTO VC_DIR_LOG, VC_DIR_OUT
	  FROM GEMCO_PARAMETRO_INTERFACE PINT, GEMCO_SISTEMA SIST
	 WHERE PINT.PINT_CD_SISTEMA = SIST.SIST_CD_SISTEMA
	   AND SIST.SIST_DS_SISTEMA = VG_PROCESSO;
  EXCEPTION
	-- SE NAO EXISTIR INFORMAR O DIRETORIO ONDE DEVERA SER
	-- GERADO O LOG DE OCORRENCIAS
	WHEN NO_DATA_FOUND THEN
	  VC_DIR_LOG := '/home/gemco/integra/Log';
	  VC_DIR_OUT := '/home/gemco/integra/Gemco-Legado';
	WHEN TOO_MANY_ROWS THEN
	  VC_DIR_LOG := '/home/gemco/integra/Log';
	  VC_DIR_OUT := '/home/gemco/integra/Gemco-Legado';
	WHEN OTHERS THEN
	  VC_DIR_LOG := '/home/gemco/integra/Log';
	  VC_DIR_OUT := '/home/gemco/integra/Gemco-Legado';
  END;

  -- SETA NOME DO ARQUIVO 
  VC_ARQ_NOME := 'NRSORTE_' || TO_CHAR(SYSDATE, 'DDMMYY_HH24MI') || '.txt';
  -- INICIA GRAVACAO
  ARQ_NRSORTE := UTL_FILE.fopen(VC_DIR_OUT, VC_ARQ_NOME, 'W');
  UTL_FILE.fclose(ARQ_NRSORTE);

  -----------------------------------------
  -- ABRE CURSOR PARA LEITURA E MONTAGEM --
  -----------------------------------------
  FOR CUR IN CUR_NRSORTE LOOP
	VC_LINHA := LPAD(CUR.NROSORTE, 5, 0) || ';' || LPAD(CUR.LOJA, 3, 0) || ';' ||
				TO_CHAR(CUR.MES_ANO, 'YYYYMMDD') || ';' ||
				LPAD(CUR.CPF, 11, 0) || ';' || CUR.NOMCLI || ';' ||
				LPAD(CUR.TELCLI, 10, ' ') || ';' ||
				LPAD(CUR.PDV_CAIXA, 3, 0) || ';' ||
				CUR.CODPRODSORT || ';' ||
				LPAD(CUR.SERIESORTEIO, 3, 0) || ';' ||
				LPAD(CUR.NUMOPERADOR, 3, 0) || ';' || CUR.VLRTRANSACAO || ';' ||
				LPAD(CUR.CODCLIENTE, 8, 0);
	-- GRAVA O REGISTRO NO ARQUIVO
	ARQ_NRSORTE := UTL_FILE.fopen(VC_DIR_OUT, VC_ARQ_NOME, 'A');
	UTL_FILE.put_line(ARQ_NRSORTE, VC_LINHA);
	UTL_FILE.fclose(ARQ_NRSORTE);
  END LOOP;
EXCEPTION
  WHEN UTL_FILE.INVALID_PATH THEN
	dbms_output.put_line('ERRO: INVALID PATH  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN UTL_FILE.INVALID_MODE THEN
	dbms_output.put_line('ERRO: FILE ' || VC_DIR_LOG || ' / ' ||
						 VC_DIR_OUT || ' INVALID MODE  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN UTL_FILE.INVALID_OPERATION THEN
	dbms_output.put_line('ERRO: FILE ' || VC_DIR_LOG || ' / ' ||
						 VC_DIR_OUT || ' INVALID OPERATION  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN UTL_FILE.INVALID_FILEHANDLE THEN
	RAISE_APPLICATION_ERROR(-20902, SQLCODE || ' ' || SQLERRM);
  WHEN UTL_FILE.INTERNAL_ERROR THEN
	dbms_output.put_line('ERRO: INTERNAL ERROR  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN UTL_FILE.READ_ERROR THEN
	dbms_output.put_line('ERRO: READ ERROR  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN UTL_FILE.WRITE_ERROR THEN
	dbms_output.put_line('ERRO: WRITE ERROR  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN VALUE_ERROR THEN
	dbms_output.put_line('ERRO: VALUE ERROR  - ' || SQLCODE || '  ' ||
						 SQLERRM);
  WHEN OTHERS THEN
	dbms_output.put_line(SQLCODE || '  ' || SQLERRM);
  
end CYBELAR_EXP_TXT_NRSORTE;

Agora preciso de uma função onde substitua um caracter por outro. Preciso nessa linha CUR.VLRTRANSACAO

 

e ao mesmo tempo preencher o restante com zeros. Esse campo é valor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora preciso de uma função onde substitua um caracter por outro. Preciso nessa linha CUR.VLRTRANSACAO

 

Duas funções fazem isto TRANSLATE e REPLACE.

 

Veja o Help para mais detalhes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver. Muito obrigado.

 

Agora tenho outra duvida em relação a isso, preciso importar um arquivo texto (mas está sem a extenção)

 

o programa que gera esse arquivo texto, cria o arquivo dessa forma ARQKGxx (onde xx é o numero da loja onde foi criado e não tem extenção, mas é um arquivo texto puro), portanto esse arquivo sempre será terá nomes diferentes (ARQKG01 / ARQKG02 ....), qndo o nome é fixo até consigo fazer essa importação, mas como o nome do arquivo não é fixo não sei por onde começar. Os arquivos irão estar sempre na mesma pasta do servidor.

 

Mas isso tem que ser via procedure, pois irei colocar um agendador de tarefas.

 

E tem que ser sequencial, ou seja, terminou um arquivo siga para o outro automaticamente

 

Espero que eu tenha explicado bem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use uma estrutura como esta para criar e repitir a lógica de execução

 

DECLARE
  VS_ARQ VARCHAR2(100);
BEGIN
  FOR I IN 1..7 
  LOOP
	VS_ARQ := 'LOJA_'||LPAD(I,5,'0');
	DBMS_OUTPUT.PUT_LINE(VS_ARQ);
  END LOOP;
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa tarde,

 

Preciso criar uma procedure que exporte os dados de uma tabela (apenas os dados) Oracle para um arquivo TXT com os campos delimitados por ; (ponto-e-virgula)?

Procurei aqui no forum e não encontrei nada....

boa tarde!

 

Você pode usar UTL_FILE, ou entao trabalhar com tabelas externas, no meu blog tem um artigo que ensina a trabalhar com esse recurso, http://formula-oracle.blogspot.com/2009/05...s-externas.html

 

[]

 

Marcio.

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.