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.