31.10. Utiliser les zones de descripteur SQL
Une zone de descripteur SQL est une méthode de traitement du résultat
d'un
SELECT
ou d'un
FETCH
plus
sophistiquée. La zone de 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 est constituée d'un en-tête, qui contient
des informations sur le descripteur complet, et un ou plusieurs
éléments de zones de descripteur, qui basiquement décrivent chacun
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;
Il reste à répondre à la question de la récupération des données de
la zone descripteur. Celle-ci peut être considéré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 doit être de
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 une constante
entière ou une variable hôte contenant un entier. Les champs
possibles sont :
-
CARDINALITY
(integer)
-
le nombre de lignes dans l'ensemble du résultat ;
-
DATA
-
l'é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 implanté ;
-
INDICATOR
(integer)
-
l'indicateur (de valeur NULL ou de troncature de la valeur) ;
-
KEY_MEMBER
(integer)
-
non implanté ;
-
LENGTH
(integer)
-
la longueur de la donnée en caractères ;
-
NAME (string)
-
le nom de la colonne ;
-
NULLABLE
(integer)
-
non implanté ;
-
OCTET_LENGTH
(integer)
-
la longueur en octets de la représentation en caractères de la
donnée ;
-
PRECISION
(integer)
-
la précision (pour le type numeric) ;
-
RETURNED_LENGTH
(integer)
-
la longueur de la donnée en caractères ;
-
RETURNED_OCTET_LENGTH
(integer)
-
la longueur en octets de la représentation en caractères de la
donnée ;
-
SCALE
(integer)
-
l'échelle (pour le type numeric) ;
-
TYPE (integer)
-
le code numérique du type de données de la colonne ;