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 | Datentyp der | Wert der | |
Statische Cursor | ja | ja | durch | |
Dynamische Cursor | mit Benutzervariablen | ja | ja | Platzhalter als |
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.