sql >> Base de Datos >  >> RDS >> Oracle

Diferencia entre PARA ACTUALIZAR DE y PARA ACTUALIZAR

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.