Aus der Oracle-Dokumentation :
Wenn Ihre Abfrage auf eine einzelne Tabelle verweist, gibt es keinen Unterschied zwischen FOR UPDATE
und FOR UPDATE OF ...
, aber letzteres kann immer noch als Selbstdokumentation nützlich sein, um anzugeben, welche Spalten Sie aktualisieren möchten. Es schränkt jedoch nicht ein, was Sie aktualisieren können. Wenn Sie Folgendes haben:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
dann kannst du immer noch:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Aber wenn es mehr als eine Tabelle gibt, dann FOR UPDATE OF ...
sperrt nur die Zeilen in den Tabellen, die die Spalten enthalten, die Sie im OF
angeben Klausel.
Im Gegensatz zu dem, was Sie meiner Meinung nach in der Frage sagen. Angabe von FOR UPDATE OF sal
sperrt nicht nur den sal
Säule; Sie können niemals eine einzelne Spalte sperren, die Mindestsperre liegt auf Zeilenebene. (Lesen Sie mehr über Sperren
). Es sperrt alle Zeilen in der Tabelle, die den SAL
enthalten Spalte, die von der Abfrage ausgewählt werden.
In der Aktualisierung Ihrer Frage schließt sich Ihre Cursorabfrage emp
an und dept
, aber der OF
-Klausel hat nur sal
, eine Spalte im emp
Tisch. Die Zeilen in emp
Die Tabelle wird gesperrt, wenn der Cursor geöffnet wird, und diese Sperren werden nicht aufgehoben, bis Sie commit
ausführen oder rollback
diese Sitzung. Innerhalb Ihrer Cursorschleife können Sie Folgendes tun:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... um die Zeile im emp
zu aktualisieren Tabelle, die sich auf diese Iteration der Schleife bezieht. Das können Sie nicht tun:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... weil Zeilen in der dept
Tabelle sind nicht gesperrt, weil keine Spalten im OF
waren . Das bedeutet auch, dass in Ihrer zweiten Sitzung die dept
Zeilen können frei aktualisiert werden, da sie nicht durch die erste Sitzung gesperrt sind.