Ir para conteúdo

POWERED BY:

Arquivado

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

caebus

Importar CSV em tabela

Recommended Posts

Bom dia a todos,

 

Preciso importar um arquivo texto delimitado(.csv) para uma tabela do oracle. Atualmente tenho o seguinte script que funcionaria com colunas de tamanho fixo. Alguém pode me ajudar a ajustá-lo para interpretar colunas delimitadas?

 

Obrigado

 

--------------------------------------------------

 

declare

v_indice number := 0;

v_linha VARCHAR2(3000);

v_arq_log utl_file.file_type; -- arquivo saida

v_caminho varchar2(50) := '/pr01001/PRDMIGOI/SAIDA/HISTCOR/MASTERSAF'; -- especifica o diretorio a ser gravado

 

begin

v_arq_log := utl_file.fopen(v_caminho,'claudio_costa.txt','r', 32767); -- abre arquivo

 

LOOP

BEGIN

utl_file.get_line(v_arq_log, v_linha);

 

dbms_output.put_line(v_linha);

 

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line('3: ');

dbms_output.put_line('erro: '||SQLERRM);

EXIT;

END;

END LOOP;

 

 

if utl_file.is_open(v_arq_log) then

utl_file.fclose(v_arq_log);

end if; -- if utl_file.is_open(v_arq_log) then

 

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line('erro: '||SQLERRM);

if utl_file.is_open(v_arq_log) then

utl_file.fclose(v_arq_log);

end if;

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque não utiliza o SQL*LOADER para realizar essa importação?

 

Pois UTL_FILE vai deixar a sua importação mais LENTA, e deverá ter vários tratamentos.

 

O SQL*LOADER tu apenas cria um arquivo de controle, específica os campos e depois realiza a importação.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos,

 

Preciso importar um arquivo texto delimitado(.csv) para uma tabela do oracle. Atualmente tenho o seguinte script que funcionaria com colunas de tamanho fixo. Alguém pode me ajudar a ajustá-lo para interpretar colunas delimitadas?

 

Obrigado

 

--------------------------------------------------

 

declare

v_indice number := 0;

v_linha VARCHAR2(3000);

v_arq_log utl_file.file_type; -- arquivo saida

v_caminho varchar2(50) := '/pr01001/PRDMIGOI/SAIDA/HISTCOR/MASTERSAF'; -- especifica o diretorio a ser gravado

 

begin

v_arq_log := utl_file.fopen(v_caminho,'claudio_costa.txt','r', 32767); -- abre arquivo

 

LOOP

BEGIN

utl_file.get_line(v_arq_log, v_linha);

 

dbms_output.put_line(v_linha);

 

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line('3: ');

dbms_output.put_line('erro: '||SQLERRM);

EXIT;

END;

END LOOP;

 

 

if utl_file.is_open(v_arq_log) then

utl_file.fclose(v_arq_log);

end if; -- if utl_file.is_open(v_arq_log) then

 

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line('erro: '||SQLERRM);

if utl_file.is_open(v_arq_log) then

utl_file.fclose(v_arq_log);

end if;

end;

Boa noite,

 

Fiz alguns Select's que podem te ajudar a desenvolver uma lógica para carregar esses dados que não são uniformes! Claro que isso só vai servir se você não usou o SQL*LOADER

 

Select REPLACE(SUBSTR('01;700;São Paulo', 1, INSTR('01;700;São Paulo', ';')), ';', '')

From Dual;

-- Com esse 1º Select, eu estou retornando o valor '01' q seria meu 1º registro dentro da String '01;700;São Paulo'

 

Select INSTR('01;700;São Paulo', ';')

From Dual;

-- Com esse 2º Select, eu busco em q posição se encontra meu 1º Delimitador (;). Nesse caso, na posição 3

 

Select REPLACE(SUBSTR('01;700;São Paulo', (3+1), INSTR(SUBSTR('01;700;São Paulo', (3+1)), ';')),';', '')

From Dual;

-- Nesse 3º Select, eu já busco meu 2º registro (700) da String. Com esse Select e o Select abaixo que vai somando em q posição ele vai encontrando os delimitadores, você pode fazer dentro de um Loop, caso você tenha que upar inúmeros registros pra tabela.

 

Select INSTR(SUBSTR('01;700;São Paulo', (3+1)), ';')

From Dual;

-- Note que na função SUBSTR, a soma do 3+1 é devido ao fato do meu 1º Delimitador estar nessa posição (3) e agora eu preciso pegar desde o 4º caracter até o próximo delimitador.

 

-- Soma do (3+4) = 7

 

Select SUBSTR('01;700;São Paulo', (7+1))

From Dual;

-- esse último, serve para você pegar o último registro (São Paulo).

 

Espero que isso não tenha ficado muito confuso e te ajude a desenvolver uma Proc de carga com UTL_FILE

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.