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.