Repositionner un curseur et en extraire des données.
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
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.
NEXT Il s'agit du positionnement par défaut, et le curseur est avancé d'une ligne avant l'extraction de la ligne.
PRIOR Entraîne la sauvegarde du curseur sur une ligne avant l'extraction.
RELATIVE Le positionnement relatif (paramètre RELATIVE) permet de déplacer le curseur du nombre de lignes spécifié dans l'une ou l'autre direction. Un nombre positif indique un déplacement vers l'avant et un nombre négatif, un déplacement vers l'arrière. Ainsi, NEXT équivaut à RELATIVE 1 et PRIOR, à RELATIVE -1. RELATIVE 0 extrait la même ligne que la dernière instruction FETCH appliquée à ce curseur.
ABSOLUTE Le positionnement absolu (paramètre ABSOLUTE) permet d'accéder à une ligne particulière. Un zéro indique la position avant la première ligne (voir Utilisation de curseurs dans les procédures et les triggers).
Un 1 indique la première ligne, et ainsi de suite. Les nombres négatifs servent à indiquer une position absolue à partir de la fin du curseur. La valeur -1 indique la dernière ligne du curseur.
FIRST Forme abrégée de ABSOLUTE 1.
LAST Forme abrégée de ABSOLUTE -1.
Problèmes liés au positionnement du curseurLes 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
où 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.
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.
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.
Aucun.
SQL/92 Fonctionnalité d'entrée de gamme. Fonctionnalité de module stocké de manière permanente utilisée dans les procédures.
SQL/99 Fonction principale. Fonctionnalité de module stocké de manière permanente utilisée dans les procédures.
Sybase Supportée par Adaptive Server Enterprise.
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;
ENDSQL Anywhere Studio 9.0.1
Copyright © 1989–2004 Sybase, Inc. Copyright partiel © 2001–2004 iAnywhere Solutions, Inc. Tous droits réservés.