Der undeklarierte Cursor
Die optionale AS CURSOR
-Klausel zeigt die Menge in der FOR SELECT
-Struktur als nicht deklarierten, benannten Cursor, der mit der WHERE CURRENT OF
-Klausel innerhalb der Anweisung oder des Blocks nach dem DO
-Befehl bearbeitet werden kann, in der richtigen Reihenfolge um die aktuelle Zeile zu löschen oder zu aktualisieren, bevor die Ausführung in die nächste Zeile übergeht.Darüber hinaus ist es möglich, den Cursornamen als Datensatzvariable zu verwenden (ähnlich wie OLD
und NEW
in Triggern), um auf die Spalten der Ergebnismenge zuzugreifen (z. B. cursor_name.columnname).
-
Beim Zugriff auf eine Cursorvariable in einer DML-Anweisung kann der Doppelpunkt-Präfix vor dem Cursornamen (d. h.
:cursor_name.columnname
) zur Disambiguierung hinzugefügt werden, ähnlich wie bei Variablen.Die Cursorvariable kann ohne Doppelpunkt-Präfix referenziert werden, aber in diesem Fall kann der Name je nach Umfang der Kontexte in der Anweisung statt in den Cursor in den Anweisungskontext aufgelöst werden (z. B. Sie wählen aus einer Tabelle mit demselben Namen als Cursor).
-
Cursorvariablen sind schreibgeschützt
-
In einer
FOR SELECT
-Anweisung ohneAS CURSOR
-Klausel müssen Sie dieINTO
-Klausel verwenden.Wenn eineAS CURSOR
-Klausel angegeben wird, ist dieINTO
-Klausel erlaubt, aber optional;Sie können stattdessen mit dem Cursor auf die Felder zugreifen. -
Das Lesen aus einer Cursor-Variablen gibt die aktuellen Feldwerte zurück.Das bedeutet, dass eine
UPDATE
-Anweisung (mit einerWHERE CURRENT OF
-Klausel) nicht nur die Tabelle, sondern auch die Felder in der Cursor-Variablen für nachfolgende Lesevorgänge aktualisiert.Die Ausführung einerDELETE
-Anweisung (mit einerWHERE CURRENT OF
-Klausel) setzt alle Felder in der Cursor-Variablen für nachfolgende Lesevorgänge aufNULL
Weitere zu berücksichtigende Punkte in Bezug auf nicht deklarierte Cursor:
-
Die Anweisungen
OPEN
,FETCH
undCLOSE
können nicht auf einen Cursor angewendet werden, der von derAS CURSOR
-Klausel angezeigt wird. -
Das Argument cursor_name, das einer
AS CURSOR
-Klausel zugeordnet ist, darf nicht mit Namen kollidieren, die durchDECLARE VARIABLE
- oderDECLARE CURSOR
-Anweisungen oben im Modulrumpf erstellt wurden, noch mit anderen Cursorn, die von einerAS CURSOR
-Klausel auftauchen -
Die optionale
FOR UPDATE
-Klausel in derSELECT
-Anweisung ist für ein positioniertes Update nicht erforderlich