PostgreSQLLa base de données la plus sophistiquée au monde.

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.

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;

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 ;