Da documentação do Oracle :
Se sua consulta fizer referência a uma única tabela, não haverá diferença entre
FOR UPDATE
e FOR UPDATE OF ...
, mas o último ainda pode ser útil como autodocumentação para indicar quais colunas você pretende atualizar. No entanto, não restringe o que você pode atualizar. Se você tem:CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
então você ainda pode fazer:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Mas se houver mais de uma tabela então
FOR UPDATE OF ...
irá apenas bloquear as linhas nas tabelas que contêm as colunas que especificar no OF
cláusula. Ao contrário do que eu acho que você está dizendo na pergunta. especificando
FOR UPDATE OF sal
não apenas bloqueia o sal
coluna; você nunca pode bloquear uma única coluna, o bloqueio mínimo é no nível da linha. (Leia mais sobre bloqueios
). Ele bloqueia todas as linhas na tabela que contém o SAL
coluna, que são selecionados pela consulta. Na atualização da sua pergunta, sua consulta de cursor está juntando
emp
e dept
, mas o OF
cláusula tem apenas sal
, uma coluna no emp
tabela. As linhas no emp
tabela será bloqueada quando o cursor for aberto, e esses bloqueios não serão liberados até que você commit
ou rollback
aquela sessão. Dentro do seu loop de cursor, você pode fazer:UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... para atualizar a linha no
emp
tabela que se relaciona com esta iteração do loop. Você não pode Faz:UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... porque as linhas no
dept
tabela não está bloqueada, porque nenhuma coluna estava em OF
. Isso também significa que em sua segunda sessão o dept
as linhas podem ser atualizadas livremente, pois não são bloqueadas pela primeira sessão.