sql >> Databáze >  >> RDS >> Oracle

Rozdíl mezi FOR UPDATE OF a FOR UPDATE

Z dokumentace Oracle :

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



  1. Jak funguje REGEXP_REPLACE() v MariaDB

  2. Existuje lepší operátor Oracle, který by provedl nulovou kontrolu rovnosti?

  3. Aplikace vs. databáze rezidentního fondu připojení

  4. 2 Funkce, které v MySQL vracejí název měsíce z data