Ако вашата заявка препраща към една таблица, тогава няма разлика между FOR UPDATE и FOR UPDATE OF ... , но последният все още може да бъде полезен като собствена документация, за да посочи кои колони възнамерявате да актуализирате. Това обаче не ограничава какво можете да актуализирате. Ако имате:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
тогава все още можете да направите:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Но ако има повече от една таблица, тогава FOR UPDATE OF ... ще заключи само редовете в таблиците, които съдържат колоните, които сте посочили в OF клауза.
Противно на това, което мисля, че казвате във въпроса. като посочите FOR UPDATE OF sal не само заключва sal колона; никога не можете да заключите една колона, минималното заключване е на ниво ред. (Прочетете повече за заключванията
). Той заключва всички редове в таблицата, която съдържа SAL колона, които са избрани от заявката.
В актуализацията на вашия въпрос вашата заявка за курсор се присъединява към emp и dept , но OF клаузата има само sal , колона в emp маса. Редовете в emp таблицата ще бъде заключена, когато курсорът се отвори, и тези заключвания няма да бъдат освободени, докато не commit или rollback тази сесия. В рамките на цикъла на курсора можете да направите:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... за да актуализирате реда в emp таблица, която се отнася до тази итерация на цикъла. Вие не можете направи:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... защото редове в dept таблицата не са заключени, защото няма колони в OF . Това също означава, че във втората ви сесия dept редовете могат да се актуализират свободно, тъй като не са заключени от първата сесия.