Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Dynamische Cursor

Cursor, die ohne Cursorbeschreibung vereinbart werden, nennt man dynamische Cursor.

Ein dynamischer Cursor wird mit DECLARE CURSOR vereinbart.
Mit PREPARE wird ein dynamischer Cursor mit einer dynamisch übersetzbaren Cursorbeschreibung verbunden. Wie bei einem statischen Cursor kann der Anwender mit OPEN-, FETCH- und CLOSE-Anweisungen auf Sätze einer Tabelle zugreifen und mit UPDATE CURRENT- und DELETE CURRENT-Anweisungen Sätze einer Tabelle ändern oder löschen.

Wie bei Anweisungen der dynamischen SQL kann durch dynamische Cursor ein zunehmender Grad an Flexibilität erreicht werden, der auf der anderen Seite einen erhöhten Programmieraufwand erfordert:

SQL-Sprachmittel

Anzahl der
Parameter zum
Übersetzungszeitpunkt
bekannt

Datentyp der
Parameter zum
Übersetzungszeitpunkt
bekannt

Wert der
Parameter

Statische Cursor

ja

ja

durch
Benutzervariablen
übergebbar

Dynamische Cursor
DECLARE CURSOR
PREPARE
OPEN... USING
FETCH ... INTO
CLOSE

mit Benutzervariablen

ja

ja

Platzhalter als
Ersatz für
Eingabeparameter

mit Deskriptorbereichen

nein

nein

Tabelle 38: Zunehmende Flexibilität beim Einsatz dynamischer Cursor


Enthält eine dynamisch übersetzbare Cursorbeschreibung Platzhalter, müssen die zugehörigen Werte über Benutzervariablen oder einen zuvor belegten Deskriptorbereich in der USING-Klausel der OPEN-Anweisung zur Verfügung gestellt werden.

Mit Hilfe eines SQL-Deskriptorbereichs können für eine dynamisch übersetzte Cursorbeschreibung

  • mit DESCRIBE INPUT die Datentypen der Platzhalter bestimmt werden

  • mit DESCRIBE OUTPUT Anzahl und Datentypen der Ergebnisspalten bestimmt und in einem Deskriptorbereich abgelegt werden

  • mit OPEN USING die Werte für die Platzhalter aus einer Benutzervariablen oder einem Deskriptorbereich entnommen werden

  • mit FETCH INTO die Werte eines Satzes der Ergebnistabelle in einen Deskriptorbereich abgelegt werden.

Dynamischer Cursor mit Schubmodus

Wie für einen statischen Cursor (siehe "SQL-Datenmanipulation mit Cursor") lässt sich auch für einen dynamischen Cursor ein Schubmodus definieren. Dazu wird das Pragma PREFETCH in der Cursorbeschreibung des dynamischen Cursors angegeben.

Wird eine FETCH-Anweisung mit einem Deskriptorbereich verwendet, dann darf dieser Deskriptorbereich nicht in SET DESCRIPTOR-, DESCRIBE- oder DEALLOCATE DESCRIPTOR-Anweisungen angesprochen werden, solange der Schubmodus aktiv ist. Außerdem gelten für einen dynamischen Cursor dieselben Einschränkungen wie für einen statischen Cursor mit Schubmodus.


Beispiel

DECLARE dyn_cursor CURSOR FOR dynstmt

Einlesen von SOURCESTMT:

--%PRAGMA PREFETCH 10
SELECT knr, firma FROM kunde WHERE land = 'D ''
PREPARE dynstmt FROM :SOURCESTMT
OPEN dyn_cursor

Schleife bis SQLSTATE = 00200:

FETCH NEXT FROM dyn_cursor INTO :KNR, :FIRMA

Bei der Cursorbeschreibung des dynamischen Cursors DYN_CURSOR wird das Pragma PREFETCH mit dem Blockungsfaktor 10 angegeben. Der Anwender erhält mit dem ersten FETCH NEXT den ersten Satz der Cursortabelle; gleichzeitig werden die 9 nächsten Sätze in den Zwischenpuffer gelesen. Der Cursor mit Schubmodus darf stets nur mit ein und derselben FETCH-Anweisung angesprochen werden, d.h. derselben FETCH-Anweisung in einer Schleife oder einem Unterprogramm. Mit der erneuten Ausführung dieser FETCH-Anweisung wird der zweite Satz des Cursors beschleunigt aus dem Zwischenpuffer gelesen.