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