Problema com external table

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
fabioing
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 12 Mar 2009 9:51 pm
Localização: Curitiba - PR

Olá pessoal,

Estou tendo um problema com external table e gostaria de saber se existe alguma forma de resolver.

Minhas E.T. estão com a seguinte configuração:

Selecionar tudo

RECORDS DELIMITED BY NEWLINE
logfile     LOG_DIR:'Nme_Arq_Log.txt'
badfile    BAD_DIR:'Nme_Arq_Bad.txt'
discardfile BAD_DIR:'Nme_Arq_Dsc.txt'
FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '"'
LDRTRIM
MISSING FIELD VALUES ARE NULL
Preciso importar alguns milhões de registros e, em alguns casos, está acontecendo o seguinte problema. Quando em uma determinada coluna tem um texto e nesse texto tem <enter> o Oracle está interpretando como quebra de linha, mesmo o texto estando delimitado por aspas duplas. Isso está me gerando sérios problemas. Pra se ter uma idéia de um arquivo com 130.000 registros, 77.000 ficaram inválidos.

Aqui está um exemplo simples de um caso:

Selecionar tudo

1;01/05/2005;"José da Silva
Rua das Acácias, 100"
Sei que o ideal seria utilizar algum delimitador de registro que não seja enter, mas infelizmente não tenho como mudar esse cenário. Os aquivos estão sendo gerados dessa forma e não tenho como mudar.

Será que alguém tem idéia de como resolver??

Um abraço a todos.

Fabio
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Fabio, eu testei o exemplo abaixo e o sql identificou que existe a quebra de linha... até aí tudo bem...

Selecionar tudo

SELECT instr('1;01/05/2005;"José da Silva 
Rua das Acácias, 100" ',chr(10))
FROM dual
Já tentou usar recursos como o exemplo abaixo?

Selecionar tudo

SELECT REPLACE('1;01/05/2005;"José da Silva 
Rua das Acácias, 100" ',chr(10),' ')
FROM dual
faça um teste colocando um número menor de linhas no arquivo e veja se importa de forma certa.

Outro ponto pra você ter cuidado é de não dar replace no último entra, o que caracteriza realmente o fim daquela linha...

Essa rotina é só para você tratar o arquivo gerado e a partir daí trabalhar com o ET...

é estranho um arquivo ser gerado assim, já que quando se trata de importações de arquivos, eles já estão em um layout pre-definido.

Veja se com isso resolve seu problema... infelizmente, terás que ter um trabalho a mais!
fabioing
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 12 Mar 2009 9:51 pm
Localização: Curitiba - PR

Rodrigo,

Agradeço muito suas dicas, mas o problema está antes do dado ser importado. Além disso preciso manter o <enter> no campo de origem, pois a retirada desse caracter pode interferir na interpretação do texto.

O exemplo que dei foi bem simplório, na verdade o conteúdo é muito maior.

Não estou conseguindo ver outra alternativa senão a troca do delimitador de registro por algum outro caracter ou combinação de caracteres.

Se você tiver alguma idéia agradeço.

Um abraço,

Fabio
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Fabio, a alternativa que te dei foi com base no seu exemplo... já que você está dizendo que a situação é mais complicada ainda, acho que fica viavel sim fazer o que você falou, ou seja, trocar o delimitador pra um conjunto de caracters.

Em uma das aplicações que fiz, utilizei o #

Abraços
fabioing
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qui, 12 Mar 2009 9:51 pm
Localização: Curitiba - PR

Descobri que o sqlldr tem a opção CONTINUEIF.

Estou convertendo meu script para usar o SQLLDR e adicionei a seguinte sintaxe:

Selecionar tudo

CONTINUEIF LAST <> '"'
Porém, com essa linha, importa somente 1 linha. :roll:

Que coisa!!!
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Vou pegar uns examplos esse final de semana e na segunda feira te dou um exemplo, se eu conseguir.
Responder
  • Informação
  • Quem está online

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