FETCH [ selector ] [ count ] { IN | FROM } cursor FETCH [ RELATIVE ] [ { [ # | ALL | NEXT | PRIOR ] } ] FROM ] cursor |
selector définit la direction. Ce peut être une des suivantes :
récupère les lignes suivantes. Valeur par défaut si selector est omis.
récupère les lignes précédentes.
mot bruit pour la compatibilité SQL92
count détermine le nombre de lignes a récupérer. Ce peut être un des suivants :
un entier signé qui spécifie le nombre de lignes a récupérer. Notez qu'un entier négatif est équivalent à changer le sens de FORWARD et BACKWARD.
retrouve tous les lignes restantes.
équivalent à spécifier un compte de 1.
équivalent à spécifier un compte de -1.
nom d'un curseur ouvert.
FETCH renvoie les résultats de la requête définie par le curseur.
Si cursor n'a pas été antérieurement déclaré. Le curseur doit être déclaré dans un block transaction.
Postgres ne supporte pas le positionnement absolu des curseurs.
SQL92 permet de retrouver de façon répétée le curseur à sa "position courante" en utiliant la syntaxe
FETCH RELATIVE 0 FROM cursor |
Postgres ne supporte pas cette notion; en fait la valeur zero est réservée pour indiquer que toutes les lignes seront retrouvées et est équivalente à spécifier le mot-clé ALL. Si le mot-clé RELATIVE a été utilisé, Postgres suppose que l'utilisateur a l'intention d'utiliser un comportement SQL92 et retourne ce message d'erreur.
FETCH permet à un utilisateur de retrouver les lignes utilisant un curseur. Le nombre de lignes retrouvées est spécifié par #. Si le nombre de lignes restantes dans le curseur sont inférieures au #, alors seules celles qui sont disponibles sont récupérées. Substituer le mot-clé ALL à la place d'un nombre permet de retrouver toutes les lignes restantes dans le curseur. Les instances peuvent être récupérées dans les deux directions FORWARD et BACKWARD. La direction par défaut est FORWARD.
les nombres négatifs sont maintenant admis pour spécifier le compte de lignes. Un nombre négatif est équivalent a inverser le sens des mots-clé FORWARD et BACKWARD. Par exemple, FORWARD -1 est identique à BACKWARD 1. |
Notez que les mots-clé FORWARD et BACKWARD sont des extensions Postgres. La syntaxe SQL92 est aussi supportée, spécifiée dans la seconde forme de la commande. Voir plus bas pour les détails.
Une fois toutes les lignes récupérées, tout autre essai de récupération ne retourne aucune ligne.
La mise à jour de données dans un curseur n'est pas supportée par Postgres, parce que l'application en retour des modifications du curseur n'est généralement pas possible, comme c'est aussi le cas avec les mises à jour de VIEW. En conséquence, les utilisateurs doivent envoyer les commandes explicites UPDATE pour remplacer les données.
Les curseurs peuvent seulement être utilisés dans les transactions parce que les données qu'ils ont stockées dépensent des multiples requêtes utilisateur.
--set up and use a cursor: -- BEGIN WORK; DECLARE liahona CURSOR FOR SELECT * FROM films; --Fetch first 5 rows in the cursor liahona: -- FETCH FORWARD 5 IN liahona; code |title |did| date_prod|kind |len -----+-----------------------+---+----------+----------+------ BL101|The Third Man |101|1949-12-23|Drama | 01:44 BL102|The African Queen |101|1951-08-11|Romantic | 01:43 JL201|Une Femme est une Femme|102|1961-03-12|Romantic | 01:25 P_301|Vertigo |103|1958-11-14|Action | 02:08 P_302|Becket |103|1964-02-03|Drama | 02:28 --Fetch previous row: -- FETCH BACKWARD 1 IN liahona; code |title |did| date_prod|kind |len -----+-----------------------+---+----------+----------+------ P_301|Vertigo |103|1958-11-14|Action | 02:08 -- close the cursor and commit work: -- CLOSE liahona; COMMIT WORK; |
L'usage non-intégré des curseurs est une extension Postgres. La syntaxe et l'usage de curseurs est à comparer à la forme intégrée des curseurs définie dans SQL92.
SQL92 admet le positionnement absolu de curseurs pour FETCH, et admet le placement des résultats dans les variables explicites.
FETCH ABSOLUTE # FROM cursor INTO :variable [, ...] |
le curseur sera positionné au numéro de ligne absolu spécifié. Tous les numéros de lignes dans Postgres sont des nombres relatifs et donc cette possibilité n'est pas supportée.
variables hôtes cibles.