Estou tentando ver como o UPDATE Lock ajuda a minimizar o erro durante as operações dml (excluir/atualizar).
declare
cursor update_lock is select empno from emp where deptno=&no for update of sal;
num number;
begin
--for i in update_lock loop
--end loop;
open update_lock;
loop
fetch update_lock into num;
exit when update_lock%notfound;
dbms_output.put_line(num);
end loop;
update emp set sal=sal+10 where current of update_lock;
close update_lock;
end;
Estou usando um código muito simples para verificar como funciona. Mas, mostrando ROWID inválido . Alguém pode me ajudar?
Seu loop está passando por todas as linhas em
emp
fordeptno=&no
, sem atualizá-las. Quando você atinge o final do conjunto de resultados (um após a última linha),exit when udpate_lock%notfound
dispara e você sai do loop, para aupdate
instrução.Nesse ponto, o cursor é inválido. Você foi além da última linha. Portanto, o
update [...] where current of
falhará - não hácurrent of
forupdate_lock
, o cursor não está posicionado em uma linha.