Pokud váš dotaz odkazuje na jedinou tabulku, pak mezi FOR UPDATE
není žádný rozdíl a FOR UPDATE OF ...
, ale ten druhý může být stále užitečný jako vlastní dokumentace k označení sloupců, které hodláte aktualizovat. Neomezuje však, co můžete aktualizovat. Pokud máte:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
pak stále můžete:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Ale pokud existuje více než jedna tabulka, pak FOR UPDATE OF ...
uzamkne pouze řádky v tabulkách, které obsahují sloupce, které určíte v OF
doložka.
Na rozdíl od toho, co si myslím, že říkáte v otázce. s uvedením FOR UPDATE OF sal
nejen uzamkne sal
sloupec; nikdy nemůžete uzamknout jeden sloupec, minimální zámek je na úrovni řádku. (Další informace o zámcích
). Uzamkne všechny řádky v tabulce, která obsahuje SAL
sloupec, které jsou vybrány dotazem.
V aktualizaci vaší otázky se váš dotaz kurzoru připojuje k emp
a dept
, ale OF
klauzule má pouze sal
, sloupec v emp
stůl. Řádky v emp
tabulka bude uzamčena při otevření kurzoru a tyto zámky nebudou uvolněny, dokud se commit
nebo rollback
ta relace. Ve smyčce kurzoru můžete:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... pro aktualizaci řádku v emp
tabulka, která se vztahuje k této iteraci cyklu. Nemůžete udělat:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... protože řádky v dept
tabulka není uzamčena, protože v OF
nebyly žádné sloupce . To také znamená, že ve vaší druhé relaci dept
řádky lze volně aktualizovat, protože nejsou uzamčeny první relací.