[oracle_br] Re: Log de registros que não estão no banco para um arquivo txt

2006-08-11 Por tôpico lucimar_lial
Obrigada, já estou carregando através de uma tabela externa e 
testando com exception.

Lucimar


--- Em oracle_br@yahoogrupos.com.br, "jlchiappa" <[EMAIL PROTECTED]> 
escreveu
>
> Hmm, só pra variar o colega lá ** não ** cita a versão de banco, de 
> repente se for 10g ele tranquilamente PODERIA usar, pelo q vejo, o 
> DML Error Logging, como mostrado em 
http://www.orafaq.com/node/76 ...
>  Se não for, acho que é OU como vc falou, em SQL direto usar a 
> cláusula de EXCEPTIONS INTO pra obter duma vez (NADA de row by 
row!!) 
> a lista de registros "ruins" , OU então a outra opção é fazer em 
> PL/SQL (em BULK, obviamente) onde aí é uma array de CENTENAS e 
> CENTENAS de registros que será inserido & validado de uma vez só 
> (sendo 9i) com a opção de BULK_EXCEPTIONS . 
>  Lembrando também que em muitos casos PODE ser interessante a opção 
> de DEFERRED CONSTRAINT, para que só realmente após o COMMIT, no FIM 
> da transação, os dados sejam validados. 
> 
> ==>> Tudo o que eu falei é pensando em fazer a validação de dados a 
> carregar via CONSTRAINT, que é sim bem eficiente MAS é mais 
otimizada 
> para validações em loop, registro-a-registro, acho que vale a pena 
> lembrar também que no 9i nós temos a EXTERNAL TABLE, com esse 
recurso 
> nós podemos fazer um SELECT no arquivo-texto a carregar, e esse 
> SELECT ** vai ** usar os ultra-eficientes mecanismos de leitura & 
> obtenção do bd Oracle, como multiblock, hashing, etc : DEPENDENDO 
DOS 
> TESTES que o colega fará, tranquilamente PODE ser mais compensador 
> validar os dados manualmente, tipo :
> 
>  a) faz um INSERT /*+ APPEND */ into tabela-erros (SELECT trazendo 
> registros da do arquivo-textocomoexternaltable que não existem nas 
> tabs-detalhe); usando NOT EXISTS, índices de função, antijoins, 
etc, 
> esse select PODE vir a ser BRUTALMENTE eficiente em alguns casos), 
e 
> guarda a qtdade de regs inseridos
>  b) aí o passo b) é simples, é INSERT /*+ APPEND */ into 
> tabelarealfinal (select * from tabelaexternal MINUS select da 
tabela 
> de erros), ou derivado disso
> 
>  
> []s
> 
>  Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br, "Marcio Portes" 
> <[EMAIL PROTECTED]> escreveu
> >
> > Voce pode criar uma tabela que recebe as exceptions da 
constraint, 
> depois
> > tratar. Mais ou menos assim:
> > 
> > [EMAIL PROTECTED]> create table t ( x int );
> > 
> > Table created.
> > 
> > [EMAIL PROTECTED]>
> > [EMAIL PROTECTED] > create table exceptions(
> >   2  row_id  rowid,
> >   3  owner   varchar2(30),
> >   4  table_name  varchar2(30),
> >   5  constraint  varchar2(30)
> >   6  );
> > 
> > Table created.
> > 
> > [EMAIL PROTECTED]>
> > [EMAIL PROTECTED]> insert into t select rownum from all_objects 
> where
> > rownum<=10;
> > 
> > 10 rows created.
> > 
> > [EMAIL PROTECTED]>
> > [EMAIL PROTECTED]> alter table t add constraint x_maior_5 check ( 
x 
> > 5 )
> > exceptions into exceptions;
> > alter table t add constraint x_maior_5 check ( x > 5 ) exceptions 
> into
> > exceptions
> >  *
> > ERROR at line 1:
> > ORA-02293: cannot validate (OPS$MARCIO.X_MAIOR_5) - check 
constraint
> > violated
> > 
> > 
> > [EMAIL PROTECTED]>
> > [EMAIL PROTECTED]> select * from exceptions;
> > 
> > ROW_ID OWNER
> > TABLE_NAME CONSTRAINT
> > -- --
> > -- --
> > AAAIFzAAJAeAAA OPS$MARCIO
> > T  X_MAIOR_5
> > AAAIFzAAJAeAAB OPS$MARCIO
> > T  X_MAIOR_5
> > AAAIFzAAJAeAAC OPS$MARCIO
> > T  X_MAIOR_5
> > AAAIFzAAJAeAAD OPS$MARCIO
> > T  X_MAIOR_5
> > AAAIFzAAJAeAAE OPS$MARCIO
> > T  X_MAIOR_5
> > 
> > 5 rows selected.
> > 
> > [EMAIL PROTECTED] >
> > [EMAIL PROTECTED]> select *
> >   2from t
> >   3   where rowid in ( select row_id from exceptions )
> >   4  /
> > 
> > X
> > -
> > 1
> > 2
> > 3
> > 4
> > 5
> > 
> > 5 rows selected.
> > 
> > 
> > 
> > On 8/9/06, lucimar_lial <[EMAIL PROTECTED]> wrote:
> > >
> > > Olá 

[oracle_br] Log de registros que não estão no banco para um arquivo txt

2006-08-09 Por tôpico lucimar_lial
Olá pessoal, gostaria de saber se vcs podem me ajudar estou fazendo uma 
procedure de carga para carregar duas tabelas sendo que essas tabelas 
contêm chaves estrangeiras para ostras tabelas e na procedure faço a 
carga da seguinte forma: 1)desabilito as constraints para estas tabelas 
periféricas;
2) realizo o insert em duas tabelas central apartir de um arquivo txt 
que contêm registros vindo do siafi e faço commit;
3) habilito as constraints sendo que se não existir algum registro na 
tabela periférica vai dar erro e não habilitará a constraint.

O que desejo é que a procedure não emita erro para o usuário mais gere 
em log com quais foram os registros que bateram na trave para que eu 
peça para um usuário cadastrar essas informções posteriormente no 
sistema. Sei que essas duas tabelas vão conter mais informações do que 
as tabelas periféricas em um dado momento mais tem que ser assim.

Desde já agradeço, Lucimar.








--
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--__

OPORTUNIDADES DE TRABALHO, VAGAS, EMPREGOS PARA PROFISSIONAIS ORACLE VISITE: 
http://www.oraclebr.com.br/
__
Seu banco Oracle retornou erro? Ora-??? Pesquise aqui: 
http://www.oraclebr.com.br/  
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
[EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html