FETCH
Abrufen aufeinanderfolgender Datensätze aus einem Datensatz, der mit einem Cursor abgerufen wurde
PSQL
FETCH [<fetch_scroll> FROM] cursor_name [INTO [:]varname [, [:]varname ...]]; <fetch_scroll> ::= NEXT | PRIOR | FIRST | LAST | RELATIVE n | ABSOLUTE n
Argument | Beschreibung |
---|---|
cursor_name |
Cursorname.Ein Cursor mit diesem Namen muss zuvor mit einem |
varname |
Variablenname |
n |
Ganzzahliger Ausdruck für die Anzahl der Zeilen |
Die FETCH
-Anweisung holt die erste und die nachfolgenden Zeilen aus der Ergebnismenge des Cursors und weist die Spaltenwerte PSQL-Variablen zu.Die Anweisung FETCH
kann nur mit einem Cursor verwendet werden, der mit der Anweisung [fblangref40-psql-declare-cursor-de] deklariert wurde.
Mit dem optionalen fetch_scroll-Teil der FETCH
-Anweisung können Sie angeben, in welche Richtung und wie viele Zeilen die Cursorposition vorrücken soll.Die NEXT
-Klausel kann für scrollbare und vorwärts gerichtete Cursor verwendet werden.Andere Klauseln werden nur für scrollbare Cursor unterstützt.
NEXT
-
bewegt den Cursor eine Zeile nach vorne;das ist die Standardeinstellung
PRIOR
-
Bewegt den Cursor einen Datensatz zurück
FIRST
-
bewegt den Cursor zum ersten Datensatz.
LAST
-
bewegt den Cursor zum letzten Datensatz
RELATIVE n
-
verschiebt den Cursor n Zeilen von der aktuellen Position;positive Zahlen bewegen sich vorwärts, negative Zahlen bewegen sich rückwärts;die Verwendung von null (
0
) bewegt den Cursor nicht, undROW_COUNT
wird auf null gesetzt, da keine neue Zeile abgerufen wurde. ABSOLUTE n
-
bewegt den Cursor in die angegebene Zeile;n ist ein ganzzahliger Ausdruck, wobei
1
die erste Zeile angibt.Bei negativen Werten wird die absolute Position vom Ende der Ergebnismenge genommen, also gibt '-1' die letzte Zeile an, '-2' die vorletzte Zeile usw.Ein Wert von Null (0
) wird vor der ersten Zeile positioniert.
Die optionale INTO
-Klausel ruft Daten aus der aktuellen Zeile des Cursors ab und lädt sie in PSQL-Variablen.Wenn der Abruf über die Grenzen der Ergebnismenge hinaus verschoben wird, werden die Variablen auf NULL
gesetzt.
Es ist auch möglich, den Cursornamen als Variable eines Zeilentyps zu verwenden (ähnlich wie OLD
und NEW
in Triggern), was den Zugriff auf die Spalten der Ergebnismenge ermöglicht (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
) zum Eindeutigmachen 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
-
Wenn der Cursor nicht auf einer Zeile positioniert ist — er ist vor der ersten oder nach der letzten Zeile positioniert — führt der Versuch, aus der Cursor-Variablen zu lesen, zu einem Fehler “Cursor cursor_name is not position in a valid aufzeichnen”
Um zu überprüfen, ob alle Zeilen der Ergebnismenge geholt wurden, gibt die Kontextvariable ROW_COUNT
die Anzahl der von der Anweisung geholten Zeilen zurück.Wenn ein Datensatz abgerufen wurde, ist ROW_COUNT
eins (1
), ansonsten null (0
).