Jeśli zapytanie odwołuje się do pojedynczej tabeli, nie ma różnicy między FOR UPDATE
i FOR UPDATE OF ...
, ale ta ostatnia może nadal być przydatna jako samodokumentacja wskazująca, które kolumny zamierzasz zaktualizować. Nie ogranicza jednak tego, co możesz zaktualizować. Jeśli masz:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
to nadal możesz zrobić:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Ale jeśli istnieje więcej niż jedna tabela, to FOR UPDATE OF ...
zablokuje tylko wiersze w tabelach, które zawierają kolumny określone w OF
klauzula.
Wbrew temu, co myślę, że mówisz w pytaniu. określenie FOR UPDATE OF sal
nie tylko blokuje sal
kolumna; nigdy nie można zablokować pojedynczej kolumny, minimalna blokada jest na poziomie wiersza. (Przeczytaj więcej o blokadach
). Blokuje wszystkie wiersze w tabeli zawierającej SAL
kolumna, które są wybrane przez zapytanie.
W aktualizacji Twojego pytania Twoje zapytanie kursora dołącza do emp
i dept
, ale OF
klauzula ma tylko sal
, kolumna w emp
stół. Wiersze w emp
tabela zostanie zablokowana po otwarciu kursora, a te blokady nie zostaną zwolnione, dopóki nie commit
lub rollback
tej sesji. W pętli kursora możesz wykonać:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... aby zaktualizować wiersz w emp
tabela, która odnosi się do tej iteracji pętli. nie możesz zrobić:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... ponieważ wiersze w dept
tabela nie jest zablokowana, ponieważ w OF
nie było żadnych kolumn . Oznacza to również, że w drugiej sesji dept
wiersze można dowolnie aktualizować, ponieważ nie są blokowane przez pierwszą sesję.