Duvida pl/SQL 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

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

Mas se deu erro na inserção o registro não será inserido mesmo, controle de transação é justamente quando você tem um grupo de registros e precisa alterar todos ou nenhum, onde as coisas não podem ficar pela metade, mas como parece que esse não é o seu caso, ignore o rollback.

P

Obrigado…

pelo retorno…

mas está acontecendo o seguinte no loop

houve no treês insert 500 registros

mas no proximo loop foi insert no primeiro e no segundo mas no terceiro insert deu erro e vou chamar a rotina de erro qdo dar roolback vai desfazer os 500 registros ( nos tres inserts) …essa é minha duvida como contornar quando der erro em um dos insert pois só poderá gravar quando os tres insert foram ok…

Não sei se deu pra entender agora minha duvida …

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