29.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 d'un descripteur SQL consiste en un en-tête, contenant des informations concernant 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, vous avez besoin d'en allouer une :

EXEC SQL ALLOCATE DESCRIPTOR identifiant;

L'identifiant sert de << nom de variable >> à la zone du descripteur. Lorsque vous n'avez plus besoin du descripteur, vous devriez le désallouer :

EXEC SQL DEALLOCATE DESCRIPTOR identifiant;

Pour utiliser la zone d'un descripteur, spécifiez-le comme cible de stockage dans une clause INTO, au lieu de lister les variables hôtes :

EXEC SQL FETCH NEXT FROM moncurseur INTO DESCRIPTOR mondesc;

Maintenant, comment récupérer les données de la zone du descripteur ? Vous pouvez imaginer la zone comme une structure avec 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, utilisez 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, utilisez la commande suivante :

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

numero peut être un entier lité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