Uit de Oracle-documentatie :
Als uw zoekopdracht naar een enkele tabel verwijst, is er geen verschil tussen FOR UPDATE
en FOR UPDATE OF ...
, maar de laatste kan nog steeds handig zijn als zelfdocumentatie om aan te geven welke kolommen u wilt bijwerken. Het beperkt echter niet wat u kunt bijwerken. Als je het volgende hebt:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
dan kun je nog steeds doen:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Maar als er meer dan één tabel is, dan FOR UPDATE OF ...
vergrendelt alleen de rijen in de tabellen die de kolommen bevatten die u opgeeft in de OF
clausule.
In tegenstelling tot wat ik denk dat je in de vraag zegt. specificeren van FOR UPDATE OF sal
vergrendelt niet alleen de sal
kolom; u kunt nooit een enkele kolom vergrendelen, de minimale vergrendeling is op rijniveau. (Lees meer over sloten
). Het vergrendelt alle rijen in de tabel die de SAL
. bevatten kolom, die worden geselecteerd door de zoekopdracht.
In de update van uw vraag voegt uw cursorquery zich bij emp
en dept
, maar de OF
clausule heeft alleen sal
, een kolom in de emp
tafel. De rijen in de emp
tabel wordt vergrendeld wanneer de cursor wordt geopend, en die vergrendelingen worden niet vrijgegeven totdat u commit
of rollback
die sessie. Binnen uw cursorlus kunt u het volgende doen:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... om de rij in de emp
. bij te werken tabel die betrekking heeft op deze iteratie van de lus. Je kan niet doen:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... omdat rijen in de dept
tabellen zijn niet vergrendeld, omdat er geen kolommen waren in de OF
. Dat betekent ook dat in je tweede sessie de dept
rijen kunnen vrij worden bijgewerkt, omdat ze niet zijn vergrendeld door de eerste sessie.