Bei den bisher beschriebenen Anweisungen der dynamischen SQL liegen Anzahl und Datentyp der Platzhalter und Ergebnisspalten einer dynamisch übersetzbaren SQL-Anweisung oder dynamischen Cursorbeschreibung zum Übersetzungszeitpunkt des ESQL-Programms fest. Um beliebige Eingabeparameter verwenden zu können und um beliebige Ergebnisse von Abfragen im ESQL-Programm verarbeiten zu können, stehen in SQL sogenannte Deskriptorbereiche zur Verfügung.
Ein Deskriptorbereich ist ein Speicherbereich, in den Werte und Informationen über Anzahl und Datentyp von Eingaben (Platzhaltern) und Ausgaben (Ergebnisspalten) von dynamisch übersetzbaren SQL-Anweisungen oder Cursorbeschreibungen eingetragen werden.
Jeder Deskriptorbereich besteht aus einer Anzahl von Einträgen. Ein Eintrag wird für jede einfache Spalte oder für jeden einfachen Wert bzw. im Fall von multiplen Spalten oder Aggregaten für jedes Spaltenelement oder jede Ausprägung angelegt. Jeder Eintrag ist in Felder unterteilt. Die Werte in diesen Feldern können mit DESCRIBE oder SET DESCRIPTOR gesetzt und mit GET DESCRIPTOR gelesen werden. Je nach Art des Eintrags sind nur bestimmte Felder mit Werten belegt. Für jeden Deskriptorbereich gibt es ein Feld COUNT, das die Anzahl der Einträge eines Deskriptorbereichs enthält.
Der Deskriptorbereich enthält folgende Felder für einen Eintrag:
Schlüsselwort | Bedeutung | kann im | ||||||||||||||||||||||||
COUNT | Anzahl der Einträge eines Deskriptorbereichs | ja | ||||||||||||||||||||||||
TYPE | Datentyp des Eintrags:
| ja | ||||||||||||||||||||||||
LENGTH | Länge bzw. maximale Länge in Zeichen bei alphanumerischen | ja | ||||||||||||||||||||||||
OCTET_LENGTH | Maximaler Speicherplatzbedarf in Bytes bei alphanumerischen | nein, | ||||||||||||||||||||||||
PRECISION | Nur für numerischen Datentypen sowie TIME und | ja | ||||||||||||||||||||||||
SCALE | Nur für Ganz- oder Festpunktzahlen: | ja | ||||||||||||||||||||||||
DATETIME_ | Nur bei Zeitdatentypen (TYPE =9): | ja | ||||||||||||||||||||||||
REPETITIONS | Bei multiplen Spalten bzw. Aggregaten: enthält beim ersten | ja | ||||||||||||||||||||||||
NULLABLE |
| nein | ||||||||||||||||||||||||
INDICATOR | Bei Deskriptorbereich für Ergebnisspalten:
Bei Deskriptorbereich für Platzhalter:
| ja | ||||||||||||||||||||||||
DATA | Wert eines Eintrags. Der Datentyp wird durch die Einträge | ja | ||||||||||||||||||||||||
NAME | Spaltenname | nein | ||||||||||||||||||||||||
UNNAMED |
| nein |
Tabelle 37: Felder eines Deskriptorbereichs
Das Feld COUNT ist pro Deskriptorbereich einmal vorhanden. Der Datentyp von NAME ist
CHAR(n) oder VARCHAR(n) mit n >= 128, der Datentyp von DATA wird durch die Einträge in TYPE, LENGTH, PRECISION und SCALE bestimmt. Die restlichen Felder haben den Datentyp SMALLINT.
Der Anwender muss sich um die interne Struktur des SQL-Deskriptorbereichs nicht kümmern, sondern kann die Felder des Deskriptorbereichs mit SQL-Anweisungen ansprechen. Je nach Anweisung werden nur bestimmte Felder des Deskriptorbereichs angesprochen.
Für das Arbeiten mit einem SQL-Deskriptorbereich gibt es eine Reihe von SQL-Anweisungen und Varianten der EXECUTE-, OPEN- und FETCH-Anweisung:
Deskriptorbereich anlegen
Ein Deskriptorbereich muss zunächst mit ALLOCATE DESCRIPTOR angelegt werden. Mit ALLOCATE DESCRIPTOR wird die maximale Anzahl der Einträge im Deskriptorbereich angegeben. Die Einträge des Deskriptorbereichs sind nach ALLOCATE DESCRIPTOR noch undefiniert.Anzahl und Datentypen von Platzhaltern beschreiben
Anzahl und Datentypen der Platzhalter einer dynamisch übersetzten SQL-Anweisung oder Cursorbeschreibung können mit DESCRIBE INPUT bestimmt und in einem Deskriptorbereich abgelegt werden.Werte für Platzhalter übergeben
Die Werte für die Platzhalter einer dynamisch übersetzten Anweisung werden bei EXECUTE... USING SQL DESCRIPTOR aus einem Deskriptorbereich entnommen.Die Werte für die Platzhalter einer dynamisch übersetzten Cursorbeschreibung werden bei OPEN... USING SQL DESCRIPTOR aus einem Deskriptorbereich entnommen. In beiden Fällen müssen die gewünschten Werte vorher mit SET DESCRIPTOR gesetzt werden.Anzahl und Datentypen von Ergebnisspalten beschreiben
Anzahl und Datentypen der Ergebnisspalten einer dynamisch übersetzten SELECT-Anweisung oder Cursorbeschreibung können mit DESCRIBE OUTPUT bestimmt und in einem Deskriptorbereich abgelegt werden.Spaltenwerte eines Ergebnissatzes ablegen
Die Spaltenwerte des Ergebnissatzes einer dynamisch übersetzten SELECT-Anweisung werden bei EXECUTE... INTO SQL DESCRIPTOR in einen Deskriptorbereich abgelegt.
Die Spaltenwerte eines Satzes der Ergebnistabelle eines dynamischen Cursors werden bei FETCH... INTO SQL DESCRIPTOR in einen Deskriptorbereich abgelegt.Deskriptorbereich ändern
Die Anzahl der Einträge oder der Inhalt eines Eintrags des Deskriptorbereichs können mit SET DESCRIPTOR geändert werden.Deskriptorbereich abfragen
Die Anzahl der Einträge oder der Inhalt von Feldern eines Eintrags im Deskriptorbereich können mit GET DESCRIPTOR gelesen werden.Deskriptorbereich freigeben
Der Speicherplatz, den ein Deskriptorbereich belegt, kann mit DEALLOCATE DESCRIPTOR wieder freigegeben werden.