Collection Contents Précédent Suivant PDF

ASA - Manuel de référence SQL

Instructions SQL

Instruction FETCH [ESQL] [SP]


Description 

Repositionner un curseur et en extraire des données.

Syntaxe 

FETCH position_curseur nom_curseur
INTO { liste_var_hôte | liste_variables }
   | USING DESCRIPTOR nom_sqlda ]
PURGE ]
BLOCK n ]
FOR UPDATE ]
ARRAY nombre_extractions ]
INTO liste_variables [ FOR UPDATE ]

position_curseur :
    NEXT | PRIOR | FIRST | LAST
| { ABSOLUTE | RELATIVE } décompte_lignes

décompte_lignes : nombre ou var_hôte

nom_curseur :  identificateur ou var_hôte

liste_var_hôte : peut contenir des variables indicateur

liste_variables :   variables de procédure stockée

nom_sqlda :   identificateur

nombre_extractions :  entier ou var_hôte

Paramètres 

INTO    La clause est facultative. Si elle est omise, l'instruction FETCH se contente de positionner le curseur. La variable liste_var_hôte s'applique à Embedded SQL uniquement.

cursor position    Vous pouvez, si nécessaire, spécifier un paramètre de positionnement permettant de déplacer le curseur avant l'extraction d'une ligne : Si l'extraction comprend un paramètre de positionnement et que la position se trouve à l'extérieur des positions autorisées du curseur, l'avertissement SQLE_NOTFOUND est émis et le champ SQLCOUNT indique l'offset à partir d'une position valide.

Par défaut, l'instruction OPEN positionne le curseur avant la première ligne.

Problèmes liés au positionnement du curseur 
Les insertions et certaines mises à jour apportées aux curseurs DYNAMIC SCROLL (à défilement dynamique) peuvent engendrer des problèmes de positionnement. Le serveur ne place les lignes insérées dans un curseur à une position prévisible que si l'instruction SELECT comporte une clause ORDER BY. Dans certains cas, la ligne insérée n'apparaît pas avant que le curseur soit fermé puis rouvert.

Cela se produit si une table temporaire a dû être créée pour ouvrir le curseur. Pour plus d'informations, reportez-vous à la section Utilisation de tables de travail dans le traitement des requêtes.

L'instruction UPDATE peut provoquer le déplacement d'une ligne dans le curseur. Cela se produit si le curseur inclut une clause ORDER BY qui utilise un index existant (aucune table temporaire n'est créée).

Clause BLOCK    L'application cliente peut extraire plusieurs lignes à la fois. Cette opération est connue sous le nom d'extraction de bloc ou d'extraction multiligne. La première extraction déclenche le renvoi de plusieurs lignes depuis le serveur. Le client place ces lignes dans un buffer et, lors des extractions suivantes, les lignes sont récupérées directement dans ces buffers sans passer par le serveur.

La clause BLOCK n'est utilisable qu'en Embedded SQL . Elle donne au client et au serveur une estimation du nombre de lignes que peut extraire l'application. La valeur spéciale zéro (0) signifie que la requête sera envoyée au serveur et qu'une seule ligne sera renvoyée (blocs de lignes non gérés).

En l'absence de spécification de la clause BLOCK, la valeur spécifiée pour OPEN est utilisée. Pour plus d'informations, reportez-vous à la section Instruction OPEN [ESQL] [SP].

FETCH RELATIVE 0 réextrait toujours la ligne.

Clause PURGE    La clause PURGE n'est utilisable qu'en Embedded SQL. Lorsqu'elle est spécifiée, le client vide ses buffers de lignes et envoie la requête d'extraction au serveur. Notez que cette requête peut renvoyer un bloc de lignes.

Clause FOR UPDATE    La clause FOR UPDATE indique que la ligne extraite sera ultérieurement mise à jour à l'aide d'une instruction UPDATE WHERE CURRENT OF CURSOR. Lorsqu'elle est spécifiée, le serveur de base de données pose un verrou en écriture sur la ligne. Le verrou est maintenu jusqu'à la fin de la transaction courante. Reportez-vous à la section Fonctionnement du verrouillage.

Clause ARRAY    La clause ARRAY n'est utilisable qu'en Embedded SQL. Elle permet d'effectuer des extractions multiligne. Son utilisation est susceptible d'améliorer les performances.

Pour effectuer des extractions multiligne en Embedded SQL, vous devez inclure l'instruction FETCH dans votre code comme suit :

EXEC SQL FETCH . . . ARRAY nnn

ARRAY nnn est le dernier élément de l'instruction. Le nombre d'extractions nnn peut être une variable hôte. Le SQLDA doit contenir nnn * (columns per row) variables. La première ligne est placée dans les variables SQLDA 0 (zéro) to (columns per row)-1, etc.

Pour consulter un exemple détaillé d'extraction étendue, reportez-vous à la section Extraction simultanée de plusieurs lignes.

Utilisation 

L'instruction FETCH extrait une ligne du curseur spécifié. Le curseur doit avoir été précédemment ouvert.

Embedded SQL    L'instruction DECLARE CURSOR doit apparaître avant l'instruction FETCH dans le code source en langage C, et l'instruction OPEN doit être exécutée avant FETCH. Si une variable hôte est utilisée pour le nom du curseur, l'instruction DECLARE doit être exécutée avant l'instruction FETCH, dans la mesure où elle génère du code.

Le serveur renvoie dans SQLCOUNT le nombre des enregistrements extraits ; s'il n'y a aucune erreur ou avertissement, la valeur renvoyée est toujours supérieure à zéro. Une valeur SQLCOUNT égale à zéro sans condition d'erreur indique qu'une ligne a été extraite avec succès.

Si l'extraction renvoie l'avertissement SQLSTATE_NOTFOUND, le champ sqlerrd[2] de la SQLCA (SQLCOUNT) contient le nombre de lignes dépassant de l'intervalle de positions admises du curseur. La valeur est zéro (0) si la ligne est introuvable bien que la position soit correcte. Par exemple, l'exécution de FETCH RELATIVE 1 s'effectue lorsque vous êtes positionné sur la dernière ligne d'un curseur. La valeur est positive si la tentative d'extraction a été effectuée au-delà de la dernière position du curseur, et négative si elle a été effectuée avant le début du curseur.

Lorsque l'instruction d'extraction s'est terminée avec succès, le champ sqlerrd[1] de la SQLCA (SQLIOCOUNT) est incrémenté du nombre d'opérations d'E/S nécessaires pour effectuer l'extraction. En fait, ce champ est incrémenté à chaque instruction de base de données.

Extraction d'une ligne    Une seule ligne du résultat de l'instruction SELECT est placée dans les variables de la liste de variables. Il existe une correspondance univoque entre la liste de sélection et la liste de variables du système hôte.

Extraction multiligne    Une ou plusieurs lignes du résultat de l'instruction SELECT sont placées soit dans les variables de la liste_variables , soit dans les zones de données du programme décrites par nom_sqlda. Dans les deux cas, il existe une correspondance univoque entre, d'une part, la liste de sélection (liste_sélection) et, d'autre part, la liste de variables hôtes (hostvar-list) ou le tableau de descripteurs nom_sqlda.

Autorisations 

Le curseur doit être ouvert et l'utilisateur doit disposer des autorisations SELECT sur les tables référencées dans la déclaration du curseur.

Effets secondaires 

Aucun.

Voir aussi 
Normes et compatibilité 
Exemple 

L'exemple suivant s'applique au langage Embedded SQL :

EXEC SQL DECLARE cur_employee CURSOR FOR
SELECT emp_id, emp_lname FROM employee;
EXEC SQL OPEN cur_employee;
EXEC SQL FETCH cur_employee
INTO :emp_number, :emp_name:indicator;

Vous trouverez ci-après un exemple de procédure :

BEGIN
   DECLARE cur_employee CURSOR FOR
      SELECT emp_lname
      FROM employee;
   DECLARE name CHAR(40);
   OPEN cur_employee;
   LOOP
      FETCH NEXT cur_employee into name;
       ...
   END LOOP
   CLOSE cur_employee;
END

Collection Contents Précédent Suivant PDF