De la documentación de Oracle :
Si su consulta hace referencia a una sola tabla, entonces no hay diferencia entre FOR UPDATE
y FOR UPDATE OF ...
, pero este último aún puede ser útil como autodocumentación para indicar qué columnas tiene la intención de actualizar. Sin embargo, no restringe lo que puede actualizar. Si tienes:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
entonces todavía puedes hacer:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Pero si hay más de una tabla entonces FOR UPDATE OF ...
solo bloqueará las filas en las tablas que contienen las columnas que especifique en el OF
cláusula.
Al contrario de lo que creo que estás diciendo en la pregunta. especificando FOR UPDATE OF sal
no solo bloquea el sal
columna; nunca puede bloquear una sola columna, el bloqueo mínimo es a nivel de fila. (Más información sobre bloqueos
). Bloquea todas las filas de la tabla que contiene el SAL
columna, que son seleccionados por la consulta.
En la actualización de su pregunta, su consulta de cursor se une a emp
y dept
, pero el OF
la cláusula solo tiene sal
, una columna en el emp
mesa. Las filas en el emp
la tabla se bloqueará cuando se abra el cursor, y esos bloqueos no se liberarán hasta que commit
o rollback
esa sesión Dentro de su bucle de cursor puede hacer:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... para actualizar la fila en el emp
tabla que se relaciona con esta iteración del bucle. Usted no puede hacer:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... porque filas en el dept
la tabla no está bloqueada, porque no había columnas en el OF
. Eso también significa que en su segunda sesión el dept
las filas se pueden actualizar libremente, ya que no están bloqueadas por la primera sesión.