## FETCH-Anweisung (fetch_statement)

Die FETCH-Anweisung (fetch_statement) weist Parametern die Werte der aktuellen Zeile einer Ergebnistabelle zu.

### Syntax

<fetch_statement> ::=
FETCH [FIRST | LAST | NEXT | PREV | <position> | SAME] [<result_table_name>] INTO <parameter_spec>,...

<position> ::=
POS (<unsigned_integer>)
| POS (<parameter_spec>)
| ABSOLUTE <integer>
| ABSOLUTE <parameter_spec>
| RELATIVE <integer>
| RELATIVE <parameter_spec>

### Erläuterung

Wenn kein Name einer Ergebnistabelle angegeben wurde, bezieht sich die FETCH-Anweisung auf die zuletzt erzeugte unbenannte Ergebnistabelle.

Je nach Suchstrategie wird die Suche nach allen Zeilen der Ergebnistabelle bei der Ausführung der SELECT-Anweisung (select_statement) durchgeführt und die Ergebnistabelle physisch erzeugt oder jeweils die nächste Zeile der Ergebnistabelle bei der Ausführung einer FETCH-Anweisung gesucht und nicht physisch gespeichert. Dies ist beim Zeitverhalten von FETCH-Anweisungen zu berücksichtigen. Außerdem kann das je nach gewähltem Isolation-Level auch dazu führen, dass bei einem FETCH Sperrprobleme auftreten, z. B. Rückmeldung 500 – Lock request timeout.

#### Zeile nicht gefunden

Sei C der Standpunkt in der Ergebnistabelle. Es wird die Rückmeldung 100 – Row not found ausgegeben, und es erfolgt keine Zuweisung von Werten an die Parameter, wenn eine der folgenden Bedingungen erfüllt ist:

· Die Ergebnistabelle ist leer.

· C steht auf oder hinter der letzten Zeile der Ergebnistabelle, und es wird FETCH oder FETCH NEXT angegeben.

· C steht auf oder vor der ersten Zeile der Ergebnistabelle, und es wird FETCH PREV angegeben.

· Es wird FETCH mit einer Position angegeben, die nicht innerhalb der Ergebnistabelle liegt.

#### FIRST | LAST | NEXT | PREV

· FETCH FIRST oder FETCH LAST: Die Ergebnistabelle ist nicht leer. Der Standpunkt in der Ergebnistabelle C wird auf die erste bzw. letzte Zeile der Ergebnistabelle gesetzt, und die Werte dieser Zeile werden den Parametern zugewiesen.

· FETCH oder FETCH NEXT: C steht vor einer Zeile der Ergebnistabelle. C wird auf diese Zeile gesetzt, und die Werte dieser Zeile werden den Parametern zugewiesen.

· FETCH oder FETCH NEXT: C steht auf einer Zeile und diese ist nicht die letzte Zeile der Ergebnistabelle. C wird auf die unmittelbar folgende Zeile gesetzt, und die Werte in dieser Folgezeile werden den Parametern zugewiesen.

· FETCH PREV: C steht hinter einer Zeile der Ergebnistabelle. C wird auf diese Zeile gesetzt, und die Werte dieser Zeile werden den Parametern zugewiesen.

· FETCH PREV: C steht auf einer Zeile und diese ist nicht die erste Zeile der Ergebnistabelle. C wird auf die unmittelbar vorangehende Zeile gesetzt, und die Werte in dieser Vorgängerzeile werden den Parametern zugewiesen.

#### <position>

Es gibt eine Reihe von Möglichkeiten zur Positionsangabe unter Verwendung der Schlüsselworte POS, ABSOLUTE und RELATIVE.

##### POS

Unabhängig von der Angabe einer ORDER-Klausel existiert implizit eine Ordnung der Zeilen einer Ergebnistabelle, so dass eine interne Nummerierung möglich ist. Diese kann durch Angabe einer ROWNO-Spalte als selektierte Spalte sichtbar gemacht werden. Die Angabe einer Position bezieht sich auf diese interne Numerierung.

· POS (<unsigned_integer>): Wenn mittels POS eine Position angegeben wurde, die kleiner oder gleich der Anzahl der Zeilen der Ergebnistabelle ist, wird C auf die entsprechende Zeile gesetzt, und die Werte dieser Zeile werden den Parametern zugewiesen. Wenn eine Position angegeben wurde, die größer als die Anzahl der Zeilen der Ergebnistabelle ist, erfolgt die Rückmeldung 100 – Zeile nicht gefunden.

· POS (<parameter_spec>)Bei der Angabe einer Position mittels POS muss die Parameterspezifikation eine positive ganze Zahl bezeichnen.

##### ABSOLUTE

ABSOLUTE (<integer>)/ABSOLUTE (<parameter_spec>): Sei x der Wert der ganzen Zahl integer bzw. der Parameterspezifikation, die bei der Positionsangabe angegeben werden. Sei abs_x der Absolutbetrag von x.

· FETCH ABSOLUTE und x ist positiv: FETCH ABSOLUTE entspricht einem FETCH POS.

· FETCH ABSOLUTE und x=0: Es erfolgt die Rückmeldung 100 – Zeile nicht gefunden.

· FETCH ABSOLUTE und x ist negativ: Der Standpunkt in der Ergebnistabelle C wird hinter die letzte Zeile der Ergebnistabelle gesetzt und von dort abs_x-mal FETCH PREV durchgeführt. Die dabei zuletzt gefundene Zeile bildet das Ergebnis der SQL-Anweisung. Diese Beschreibung stellt nicht den Ablauf, sondern die Logik der Anweisung dar. Ist abs_x größer als die Anzahl der Zeilen der Ergebnistabelle, erfolgt die Rückmeldung 100 – Zeile nicht gefunden.

##### RELATIVE

RELATIVE (<integer>)/RELATIVE (<parameter_spec>): Sei x der Wert der ganzen Zahl integer bzw. der Parameterspezifikation, die bei der Positionsangabe angegeben werden. Sei abs_x der Absolutbetrag von x.

· FETCH RELATIVE und x ist positiv: Ausgehend vom aktuellen Standpunkt in der Ergebnistabelle C wird FETCH NEXT x-mal ausgeführt.

· FETCH RELATIVE und x=0: Entspricht einem FETCH SAME.

· FETCH RELATIVE und x ist negativ: Ausgehend von C wird FETCH PREV abs_x-mal ausgeführt. Diese Beschreibung stellt nicht den Ablauf, sondern die Logik der Anweisung dar. Die Rückmeldung 100 – Zeile nicht gefunden wird ausgegeben, wenn eine der im Abschnitt "Zeile nicht gefunden" angeführten Bedingungen erfüllt ist.

#### SAME

Die zuletzt ermittelte Zeile der Ergebnistabelle wird nochmals ausgegeben.

#### <parameter_spec>

Die in einer Positionsangabe position angegebene Parameterspezifikation muss eine ganze Zahl bezeichnen. Die übrigen durch die Parameterspezifikationen angegebenen Parameter sind Ausgabeparameter. Der durch die n-te Parameterspezifikation identifizierte Parameter korrespondiert mit dem n-ten Wert der aktuellen Zeile der Ergebnistabelle. Wenn diese Zeile mehr Spalten hat, als Parameter spezifiziert wurden, werden Werte der Spalten ignoriert, für die keine korrespondierenden Parameter existieren. Wenn die Zeile weniger Spalten hat, als Parameter spezifiziert wurden, werden den überzähligen Parametern keine Werte zugewiesen. Für die Zuweisung von NULL-Werten oder Spezial-NULL-Werten muss ein Indikatorname angegeben werden.

Zahlen werden umgewandelt und Zeichenketten abgeschnitten oder verlängert, wenn das zur Anpassung an die korrespondierenden Parameter erforderlich ist. Wenn während der Zuweisung eines Wertes an einen Parameter ein Fehler auftritt, wird diese Zuweisung nicht ausgeführt, und es erfolgen auch keine weiteren Zuweisungen an korrespondierende Parameter aufgrund dieser FETCH-Anweisung. Schon erfolgte Zuweisungen von Werten an Parameter bleiben erhalten.

Sei p ein Parameter und v der entsprechende Wert in der aktuellen Zeile der Ergebnistabelle.

· v ist eine Zahl: p muss ein numerischer Parameter sein, und v muss innerhalb des zulässigen Wertebereichs von p liegen.

· v ist eine Zeichenkette: p muss ein alphanumerischer Parameter sein.

#### Weitere Informationen

Wurde in der QUERY-Anweisung kein FOR REUSE angegeben, können nachfolgende INSERT-, UPDATE- oder DELETE-Anweisungen, die sich auf die zugrundeliegende Basistabelle beziehen und von dem Benutzer selber oder von anderen Benutzern abgesetzt werden, dazu führen, dass das mehrmalige Absetzen einer FETCH-Anweisung trotz gleicher Angabe der Position unterschiedliche Zeilen der Ergebnistabelle bezeichnet.

Änderungen durch andere Benutzer können durch eine LOCK-Anweisung für die gesamte Tabelle oder die Verwendung des Isolation-Levels 2, 3, 15, 20 oder 30 bei der CONNECT-Anweisung oder der LOCK-Option der QUERY-Anweisung verhindert werden.
Ist das nicht möglich oder ändert der Benutzer selber in dieser Tabelle, ist die Angabe von FOR REUSE notwendig. Zwischenzeitlich durchgeführte Änderungen sind dann nicht sichtbar.

Enthält die Ergebnistabelle LONG-Spalten und wurde die Ergebnistabelle physisch erzeugt, ist bei Verwendung der Isolation-Levels 0, 1 und 15 nicht sichergestellt, dass Konsistenz zwischen dem Inhalt der LONG-Spalten und dem der übrigen Spalten herrscht. Wurde die Ergebnistabelle nicht physisch erzeugt, ist die Konsistenz nur im Isolation-Level 0 nicht sichergestellt. Es wird deshalb empfohlen, durch Verwendung einer LOCK-Anweisung oder der Isolation-Levels 2, 3, 20 oder 30 die Konsistenz sicherzustellen.