30.8. Utiliser les zones des descripteurs SQL

Une zone de descripteur SQL est une méthode plus sophistiquée pour traiter le résultat d'un SELECT ou d'un FETCH. La zone du descripteur SQL groupe les données d'une ligne avec les éléments de métadonnées en une seule structure de données. Les métadonnées sont particulièrement utiles lors de l'exécution d'instructions SQL dynamiques pour lesquelles la nature des colonnes de résultats n'est pas forcément connue à l'avance.

Une zone de descripteur SQL consiste en un en-tête, contenant des informations sur le descripteur complet, et un ou plusieurs éléments des zones du descripteur, décrivant basiquement une colonne de la ligne de résultat.

Avant d'utiliser une zone de descripteur SQL, il est nécessaire d'en allouer une :

EXEC SQL ALLOCATE DESCRIPTOR identifiant;

L'identifiant sert de << nom de variable >> à la zone du descripteur. Lorsque le descripteur n'est plus utilisé, il est recommandé de le désallouer :

EXEC SQL DEALLOCATE DESCRIPTOR identifiant;

Pour utiliser la zone d'un descripteur, il faut le spécifier comme cible de stockage dans une clause INTO à la place de la liste des variables hôtes :

EXEC SQL FETCH NEXT FROM moncurseur INTO DESCRIPTOR mondesc;

Comment récupérer les données de la zone du descripteur ? Celle-ci peut être envisagée comme une structure contenant des champs nommés. Pour récupérer la valeur d'un champ à partir de l'en-tête et la stocker dans une variable hôte, on utilise la commande suivante :

EXEC SQL GET DESCRIPTOR nom :varhote = champ;

Actuellement, il n'existe qu'un seul champ d'en-tête défini : COUNT, qui indique le nombre d'éléments dans la zone de descripteur (c'est-à-dire le nombre de colonnes contenues dans le résultat). La variable hôte nécessite d'être du type entier. Pour récupérer un champ à partir de l'élément de la zone du descripteur, on utilise la commande suivante :

EXEC SQL GET DESCRIPTOR nom VALUE
numero :varhote =
champ;

numero peut être un entier littéral ou une variable hôte contenant un entier. Les champs possibles sont :

CARDINALITY (integer)

nombre de lignes dans l'ensemble du résultat

DATA

élément de données en cours (de fait, le type de données de ce champ dépend de la requête)

DATETIME_INTERVAL_CODE (integer)

?

DATETIME_INTERVAL_PRECISION (integer)

non implémenté

INDICATOR (integer)

l'indicateur (indiquant une valeur nulle ou une troncature de la valeur)

KEY_MEMBER (integer)

non implémenté

LENGTH (integer)

longueur de la donnée en caractères

NAME (string)

nom de la colonne

NULLABLE (integer)

non implémenté

OCTET_LENGTH (integer)

longueur en octets de la représentation en caractères de la donnée

PRECISION (integer)

précision (pour le type numeric)

RETURNED_LENGTH (integer)

longueur de la donnée en caractère

RETURNED_OCTET_LENGTH (integer)

longueur en octets de la représentation en caractères de la donnée

SCALE (integer)

échelle (pour le type numeric)

TYPE (integer)

code numérique du type de données de la colonne