Documentation PostgreSQL 8.1.23 > Interfaces client > ECPG - SQL embarqué dans du C > Utiliser les zones des descripteurs SQL | |
SQL dynamique | Gestion des erreurs |
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. La portée du descripteur alloué est QUOI ? 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 :
nombre de lignes dans l'ensemble du résultat
élément de données en cours (de fait, le type de données de ce champ dépend de la requête)
?
non implémenté
l'indicateur (indiquant une valeur NULL ou une troncature de la valeur)
non implémenté
longueur de la donnée en caractères
nom de la colonne
non implémenté
longueur en octets de la représentation en caractères de la donnée
précision (pour le type numeric)
longueur de la donnée en caractère
longueur en octets de la représentation en caractères de la donnée
échelle (pour le type numeric)
code numérique du type de données de la colonne