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á