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ę.