Fra Oracle-dokumentationen :
Hvis din forespørgsel refererer til en enkelt tabel, er der ingen forskel mellem FOR UPDATE og FOR UPDATE OF ... , men sidstnævnte kan stadig være nyttig som selvdokumentation for at angive, hvilke kolonner du har tænkt dig at opdatere. Det begrænser dog ikke, hvad du kan opdatere. Hvis du har:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
så kan du stadig gøre:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Men hvis der er mere end én tabel, så FOR UPDATE OF ... vil kun låse rækkerne i tabellerne, der indeholder de kolonner, du angiver i OF klausul.
I modsætning til hvad jeg tror du siger i spørgsmålet. med angivelse af FOR UPDATE OF sal låser ikke kun sal kolonne; du kan aldrig låse en enkelt kolonne, minimumslåsen er på rækkeniveau. (Læs mere om låse
). Den låser alle rækker i tabellen, der indeholder SAL kolonne, som er valgt af forespørgslen.
I opdateringen til dit spørgsmål slutter din markørforespørgsel sig til emp og dept , men OF klausul har kun sal , en kolonne i emp bord. Rækkerne i emp tabellen vil være låst, når markøren åbnes, og disse låse frigives ikke, før du commit eller rollback den session. Inden for din markørløkke kan du gøre:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... for at opdatere rækken i emp tabel, der relaterer til denne iteration af løkken. Du kan ikke gør:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... fordi rækker i dept tabellen er ikke låst, fordi ingen kolonner var i OF . Det betyder også, at dept i din anden session rækker kan opdateres frit, da de ikke er låst ved den første session.