Oracle
 sql >> Database >  >> RDS >> Oracle

Differenza tra FOR UPDATE OF e FOR UPDATE

Dalla documentazione Oracle :

Se la tua query fa riferimento a una singola tabella, non c'è differenza tra FOR UPDATE e FOR UPDATE OF ... , ma quest'ultimo può comunque essere utile come autodocumentazione per indicare quali colonne si intende aggiornare. Tuttavia, non limita ciò che puoi aggiornare. Se hai:

CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;

allora puoi ancora fare:

UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;

Ma se c'è più di una tabella allora FOR UPDATE OF ... bloccherà solo le righe nelle tabelle che contengono le colonne specificate in OF clausola.

Contrariamente a quanto penso tu stia dicendo nella domanda. specificando FOR UPDATE OF sal non blocca solo il sal colonna; non puoi mai bloccare una singola colonna, il blocco minimo è a livello di riga. (Ulteriori informazioni sui blocchi ). Blocca tutte le righe della tabella che contiene il SAL colonna, che sono selezionati dalla query.

Nell'aggiornamento della tua domanda, la tua query con il cursore si unisce a emp e dept , ma il OF la clausola ha solo sal , una colonna in emp tavolo. Le righe in emp la tabella verrà bloccata all'apertura del cursore e tali blocchi non verranno rilasciati finché non commit o rollback quella sessione. All'interno del tuo ciclo del cursore puoi fare:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... per aggiornare la riga in emp tabella relativa a questa iterazione del ciclo. non puoi fare:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... perché le righe nel dept le tabelle non sono bloccate, perché non c'erano colonne nel OF . Ciò significa anche che nella tua seconda sessione il dept le righe possono essere aggiornate liberamente, in quanto non sono bloccate dalla prima sessione.