FETCH positioniert einen Cursor. Die neue Cursorposition ist entweder auf einem Satz, vor dem ersten Satz oder hinter dem letzten Satz der Cursortabelle. Ist die neue Cursorposition auf einem Satz der Cursortabelle, wird dieser Satz zum aktuellen Satz, und die Spaltenwerte dieses Satzes werden gelesen.
Wird bei FETCH kein Satz gelesen, weil die angegebene Position nicht existiert, wird ein entsprechender SQLSTATE gesetzt, der mit WHENEVER NOT FOUND behandelt werden kann.
Ein mit SCROLL vereinbarter Cursor kann mit FETCH auf einen beliebigen Satz der Cursortabelle positioniert werden. Ein mit NO SCROLL vereinbarter Cursor kann nur auf den jeweils nächsten Satz positioniert werden (FETCH NEXT...).
Die Werte des aktuellen Satzes können in Benutzervariable, Prozedurparameter vom Typ INOUT oder OUT, lokale Variable oder in einen SQL-Deskriptorbereich übertragen werden.
Die Cursorvereinbarung mit DECLARE CURSOR muss in derselben Übersetzungseinheit im Programmtext vor der FETCH-Anweisung stehen.
Zum Zeitpunkt des FETCH darf kein mit einer STORE-Anweisung erstellter Sicherungsstand des Cursors existieren. Der Cursor muss geöffnet sein.
Falls der Cursor mit WITH HOLD deklariert wurde, muss der Isolationslevel bzw. der Konsistenzlevel der Transaktion derselbe sein, wie beim Öffnen des Cursors.
Ist für den Cursor der Schubmodus eingeschaltet (siehe Abschnitt „Pragma PREFETCH" ) und wurde für den Cursor bereits eine Anweisung FETCH NEXT... ausgeführt, so ist nachfolgend für diesen Cursor nur noch diese FETCH NEXT-Anweisung erlaubt, d.h., dieselbe Anweisung in einer Schleife oder einem Unterprogramm.
FETCH { [NEXT] | PRIOR | FIRST | LAST | RELATIVE
n | ABSOLUTE
n }
[FROM]
cursor
{ INTO
variable ,... | SQL DESCRIPTOR GLOBAL
deskriptor }
n ::= {
ganzzahl | :
benutzervariable |
routinenparameter |
lokale_variable }
variable ::=
{
:
benutzervariable [[INDICATOR] :
indikatorvariable ] |
routinenparameter |
lokale_variable
}
NEXT
Positioniert den Cursor auf den nächsten Satz der Cursortabelle. Bei einem ohne SCROLL vereinbarten Cursor können Sie nur die NEXT-Klausel verwenden.
Steht der Cursor auf dem letzten Satz der Cursortabelle, wird er hinter den letzten Satz positioniert. Steht er bereits hinter dem letzten Satz, bleibt die Position unverändert.
PRIOR
Positioniert den Cursor auf den vorhergehenden Satz der Cursortabelle.
Steht der Cursor auf dem ersten Satz der Cursortabelle, wird er vor den ersten Satz positioniert. Steht er bereits vor dem ersten Satz, bleibt die Position unverändert. PRIOR ist nur zulässig, wenn Sie den Cursor mit SCROLL vereinbart haben.
FIRST
Positioniert den Cursor auf den ersten Satz der Cursortabelle bzw. vor den ersten Satz, wenn die Cursortabelle leer ist.
FIRST ist nur zulässig, wenn Sie den Cursor mit SCROLL vereinbart haben.
LAST
Positioniert den Cursor auf den letzten Satz der Cursortabelle bzw. hinter den letzten Satz, wenn die Cursortabelle leer ist.
LAST ist nur zulässig, wenn Sie den Cursor mit SCROLL vereinbart haben.
ABSOLUTE n
Position für den Cursor angeben.
ABSOLUTE ist nur zulässig, wenn Sie den Cursor mit SCROLL vereinbart haben.
Für n können Sie Folgendes angeben:
eine Ganzzahl
eine Benutzervariable (wenn die Anweisung nicht Bestandteil einer Prozedur ist) vom SQL-Datentyp INT oder SMALLINT
einen Routinen-Parameter oder eine lokale Variable (wenn die Anweisung Bestandteil einer Routine ist) vom SQL-Datentyp INT oder SMALLINT
Die Cursorposition wird abhängig vom Wert für n wie folgt bestimmt:
>0 | Der Cursor wird auf den n-ten Satz der Cursortabelle positioniert bzw. hinter den letzten Satz, wenn n > Anzahl der Sätze der Cursortabelle. |
0 | Der Cursor wird vor den ersten Satz der Cursortabelle positioniert. |
<0 | Der Cursor wird auf den (N+1-|n|)-ten Satz der Cursortabelle positioniert, wobei |
Beispiel
FETCH ABSOLUTE -1
und
FETCH LAST
sind äquivalent.
RELATIVE n
Position für den Cursor relativ zur aktuellen Position angeben. RELATIVE ist nur zulässig, wenn Sie den Cursor mit SCROLL vereinbart haben.
Für n können Sie Folgendes angeben:
ein ganzzahliges Literal
eine Benutzervariable (wenn die Anweisung nicht Bestandteil einer Prozedur ist) vom SQL-Datentyp INT oder SMALLINT
einen Routinen-Parameter oder eine lokale Variable (wenn die Anweisung Bestandteil einer Routine ist) vom SQL-Datentyp INT oder SMALLINT
Die Cursorposition wird abhängig vom Wert für n wie folgt bestimmt:
>0 | Der Cursor wird auf den Satz positioniert, der n Sätze hinter seiner aktuellen Position liegt. Ist die neue Position größer als die Anzahl der Sätze der Cursortabelle, wird der Cursor hinter den letzten Satz positioniert. |
0 | Die Cursorposition bleibt unverändert. |
<0 | Der Cursor wird auf den Satz positioniert, der n Sätze vor seiner aktuellen Position liegt. Wird die neue Position <= 1, wird der Cursor vor den ersten Satz positioniert. |
FROM cursor
Name des Cursors.
INTO-Klausel
Angabe, wohin die gelesenen Werte gespeichert werden.
:benutzervariable, routinenparameter, lokale_variable
Name einer Benutzervariablen (wenn die Anweisung nicht Bestandteil einer Prozedur ist) bzw. Name eines Prozedurparameters von Typ INOUT oder OUT oder einer lokalen Variablen (wenn die Anweisung Bestandteil einer Routine ist). Der Spaltenwert des Ergebnissatzes wird dem angegebenen Ausgabeziel zugewiesen.
Der Datentyp muss mit dem Datentyp des zugehörigen Ausgabewerts verträglich sein (siehe Abschnitt „Werte in Benutzervariable oder Deskriptorbereich lesen"). Ist ein Ausgabewert ein Aggregat mit mehreren Elementen (nur bei Benutzervariable), muss die zugehörige Benutzervariable ein Vektor mit derselben Anzahl von Elementen sein.
Die Anzahl der angegebenen Elemente muss mit der Anzahl der Spalten in der SELECT-Liste der Cursorbeschreibung übereinstimmen. Der Wert der i-ten Spalte in der SELECT-Liste wird dem i-ten Ausgabeziel in der INTO-Klausel zugewiesen.
indikatorvariable
Name der Indikatorvariable, die zu der vorangehenden Benutzervariable gehört. Ist die Benutzervariable ein Vektor, muss auch die Indikatorvariable ein Vektor mit derselben Elementanzahl sein.
Die Indikatorvariable zeigt an, ob der NULL-Wert übertragen wurde oder Datenverlust aufgetreten ist:
0 | Die Benutzervariable enthält den gelesenen Wert. Die Zuweisung war |
-1 | Der Wert, der zugewiesen werden sollte, ist der NULL-Wert. |
>0 | Bei alphanumerischen Werten oder National-Werten: |
deskriptor
Für dynamischen Cursor.
Name eines SQL-Deskriptorbereichs, der die Datentypbeschreibung für die Ausgabewerte enthält und in den die mit FETCH gelesenen Ausgabewerte geschrieben werden.
Der SQL-Deskriptorbereich muss vorher angelegt und geeignet belegt worden sein:
Der Wert des Felds COUNT muss mit der Anzahl der Ausgabewerte übereinstimmen, die sich wie folgt berechnet: Anzahl der einfachen Ergebnisspalten plus Anzahl der Spaltenelemente von jeder multiplen Ergebnisspalte. Zusätzlich muss gelten:
0 <= COUNT <= festgelegte Maximalanzahl von Deskriptorbereichseinträgen
Die Ausgabewerte werden den DATA-Feldern der Deskriptorbereichseinträge in der Reihenfolge der Einträge im Deskriptorbereich zugewiesen. Die Datentypbeschreibung eines Eintrags muss mit dem Datentyp des zugehörigen Ausgabewerts verträglich sein (siehe Abschnitt „Werte in Benutzervariable oder Deskriptorbereich lesen").
Ist ein zu übertragender Wert NULL, wird das entsprechende INDICATOR-Feld auf den Wert -1 gesetzt. Wird eine zuzuweisende Zeichenkette abgeschnitten, gibt das entsprechende INDICATOR-Feld die Originallänge an.
Ist für den geöffneten Cursor cursor der Schubmodus eingeschaltet, und wurde für cursor bereits eine Anweisung FETCH NEXT... ausgeführt, deren INTO-Klausel den Namen eines anderen SQL-Deskriptorbereichs enthält, so erhalten Sie eine Fehlermeldung.
Verhalten von SESAM/SQL im Fehlerfall
Bei Fehlern beim Lesen der Werte (z.B. Wert ist der NULL-Wert, aber Indikatorvariable ist nicht angegeben; numerischer Wert für Zieldatentyp zu groß) hat der Cursor die neue Position, aber die zugewiesenen Werte sind undefiniert.
Bei anderen Fehlern (z.B. Datentypen nicht verträglich) bleibt die Position unverändert und es werden keine Werte gelesen.
Beispiele
Das folgende Beispiel positioniert den Cursor CUR_AUFTRAG auf einen Satz der Cursortabelle und liest die Spaltenwerte des aktuellen Satzes in die Benutzervariablen ANR, KNR, KONR, ATEXT, FERTIGSOLL und ASTNR.
Mit den Indikatorvariablen INDKONR, INDATEXT und INDFERTIGSOLL wird geprüft, ob bei der Übertragung der alphanumerischen Werte Informationsverlust aufgetreten ist und ob eine Spalte den NULL-Wert enthält.
FETCH cur_auftrag INTO :ANR, :KNR, :KONR INDICATOR :INDKONR, :ATEXT INDICATOR :INDATEXT, :FERTIGSOLL INDICATOR :INDFERTIGSOLL, :ASTNR
Das folgende Beispiel positioniert den Cursor CUR_ERGEBNIS auf einen Satz der Cursortabelle und liest die Spaltenwerte in den Deskriptorbereich DESKR_BEREICH.
FETCH cur_ergebnis INTO SQL DESCRIPTOR GLOBAL 'DESKR_BEREICH'
Siehe auch
CLOSE, DECLARE CURSOR, DELETE, OPEN, STORE, UPDATE