Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Diferença entre FOR UPDATE OF e FOR UPDATE


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.