Trata transação PL/SQL para WEB ? Oracle

2 respostas
P

Olá pessoal,

estou com uma duvida como tratar no PL/SQL abaixo
onde se inserir 500 registros e der erro (insert into fornecedor )
vou para uma rotina erro só que ela tem um rollback
e os 500 registros serão desfeitos …

Será que tem algum jeito para dar roll back somente
neste registro que deu erro e deixando os restantes
para quando o contador = 1000 dar commit .

A regra é o seguinte tem que os 3 (tres insert) tem que
sido com sucesso se algum tiver erro dar rollback somente
nesse registro !!!

Tenho que fazer commit de 1000 pois leio no cursor
1 milhao de registros …

Se alguem puder me ajudar agardeceria

abs

create or replace procedure test is

cursor c_princ is

select * from cliente;

r_princ c_princ%rowtype;

v_erro exception;
begin

open c_princ;
loop

begin

fetch c_princ into r_princ;

exit when c_princ%notfound;
– insert produto

insert into produto values (r_princ.codigo);

raise v_erro;

– insert transporte

insert into transporte values (r_princ.codigo);

raise v_erro;

– insert forncecedor

insert into fornecedor values (r_princ.codigo);

raise v_erro;
if v_contador = 1000 then

commit;

v_contador :=0;

end if;

v_contador := v_contador +1;
exception

when v_erro then

rollback;

proc_log;

end;

end loop;
close c_princ;

end;

2 Respostas

J

Você não conseguirá fazer rollback somente de uma linha. Poderia até criar savepoints mas acho que não é o caso. Tenho outra sugestão,
faça o seguinte, crie uma tabela de erros e vai alimentando ela à medida que os erros vão ocorrendo e use o commit soment no final.

Ex.:

loop cursor
  begin
    insert into tabela values (valores);
  exception
     when others then
        insert into tabela_erro ('tabela: '|| tabela || ' erro: '|| sqlerrm);
  end;
end loop;

commit;

No fim, você terá os “commits” corretos e uma tabela com os registros problemáticos.

O

O Oracle tem o conceito de savepoint:
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/06_ora.htm#2100

Criado 12 de março de 2007
Ultima resposta 12 de mar. de 2007
Respostas 2
Participantes 3