Ако вашата заявка препраща към една таблица, тогава няма разлика между 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
редовете могат да се актуализират свободно, тъй като не са заключени от първата сесия.