Documentation PostgreSQL 9.1.24 > Référence > Commandes SQL > DECLARE | |
![]() |
DELETE![]() |
DECLARE â DĂ©finir un curseur
DECLARE nom [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ { WITH | WITHOUT } HOLD ] FOR requĂȘte
DECLARE permet Ă un utilisateur de crĂ©er des curseurs. Ils peuvent ĂȘtre utilisĂ©s pour rĂ©cupĂ©rer un petit nombre de lignes Ă la fois Ă partir d'une requĂȘte plus importante. AprĂšs la crĂ©ation du curseur, les lignes sont rĂ©cupĂ©rĂ©es en utilisant FETCH(7).
Cette page décrit l'utilisation des curseurs au niveau de la commande SQL. Si vous voulez utiliser des curseurs dans une fonction PL/pgSQL, les rÚgles sont différentes -- voir Section 39.7, « Curseurs ».
Le nom du curseur à créer.
Le curseur retourne les données au format binaire.
Les donnĂ©es rĂ©cupĂ©rĂ©es Ă partir du curseur ne doivent pas ĂȘtre affectĂ©es par les mises Ă jour des tables concernĂ©es par le curseur qui surviennent une fois que ce dernier est créé. Dans PostgreSQLâą, c'est le comportement par dĂ©faut ; ce mot-clĂ© n'a aucun effet. Il est seulement acceptĂ© pour des raisons de compatibilitĂ© avec le standard SQL.
SCROLL indique une utilisation possible du curseur pour rĂ©cupĂ©rer des lignes de façon non sĂ©quentielle (c'est-Ă -dire en remontant la liste). En fonction de la complexitĂ© du plan d'exĂ©cution de la requĂȘte, SCROLL peut induire des pertes de performance sur le temps d'exĂ©cution de la requĂȘte. NO SCROLL indique que le curseur ne peut pas ĂȘtre utilisĂ© pour rĂ©cupĂ©rer des lignes de façon non sĂ©quentielle. La valeur par dĂ©faut autorise la non-sĂ©quentialitĂ© du curseur dans certains cas ; ce n'est pas la mĂȘme chose que de spĂ©cifier SCROLL. Voir la section intitulĂ©e « Notes » pour les dĂ©tails.
WITH HOLD (NDT : persistant) indique une utilisation possible du curseur aprÚs la validation de la transaction qui l'a créé. WITHOUT HOLD (NDT : volatil) interdit l'utilisation du curseur en dehors de la transaction qui l'a créé. WITHOUT HOLD est la valeur par défaut.
Une commande SELECT(7) ou VALUES(7) qui fournira les lignes Ă renvoyer par le curseur.
Les mots clés BINARY, INSENSITIVE et SCROLL peuvent apparaßtre dans n'importe quel ordre.
Les curseurs normaux renvoient les donnĂ©es au format texte, le mĂȘme que produirait un SELECT. L'option BINARY spĂ©cifie que le curseur doit renvoyer les donnĂ©es au format binaire. Ceci rĂ©duit les efforts de conversion pour le serveur et le client, au coĂ»t d'un effort particulier de dĂ©veloppement pour la gestion des formats de donnĂ©es binaires dĂ©pendants des plateformes. Comme exemple, si une requĂȘte renvoie une valeur de un dans une colonne de type integer, vous obtiendrez une chaĂźne 1 avec un curseur par dĂ©faut. Avec un curseur binaire, vous obtiendrez un champ sur quatre octet contenant la reprĂ©sentation interne de la valeur (dans l'ordre big-endian).
Les curseurs binaires doivent ĂȘtre utilisĂ©s en faisant trĂšs attention. Beaucoup d'applications, incluant psql, ne sont pas prĂ©parĂ©es Ă gĂ©rer des curseurs binaires et s'attendent Ă ce que les donnĂ©es reviennent dans le format texte.
Quand l'application cliente utilise le protocole des « requĂȘtes Ă©tendues » pour exĂ©cuter la commande FETCH, le message Bind du protocole spĂ©cifie si les donnĂ©es sont Ă rĂ©cupĂ©rer au format texte ou binaire. Ce choix surcharge la façon dont le curseur est dĂ©fini. Le concept de curseur binaire est donc obsolĂšte lors de l'utilisation du protocole des requĂȘtes Ă©tendues -- tout curseur peut ĂȘtre traitĂ© soit en texte soit en binaire.
Si la clause WITH HOLD n'est pas prĂ©cisĂ©e, le curseur créé par cette commande ne peut ĂȘtre utilisĂ© qu'Ă l'intĂ©rieur d'une transaction. Ainsi, DECLARE sans WITH HOLD est inutile Ă l'extĂ©rieur d'un bloc de transaction : le curseur survivrait seulement jusqu'Ă la fin de l'instruction. PostgreSQLâą rapporte donc une erreur si cette commande est utilisĂ©e en dehors d'un bloc de transactions. On utilise BEGIN(7) et COMMIT(7) (ou ROLLBACK(7)) pour dĂ©finir un bloc de transaction.
Si la clause WITH HOLD est précisée, et que la transaction qui a créé le curseur est validée, ce dernier reste accessible par les transactions ultérieures de la session. Au contraire, si la transaction initiale est annulée, le curseur est supprimé. Un curseur créé avec la clause WITH HOLD est fermé soit par un appel explicite à la commande CLOSE, soit par la fin de la session. Dans l'implantation actuelle, les lignes représentées par un curseur persistant (WITH HOLD) sont copiées dans un fichier temporaire ou en mémoire afin de garantir leur disponibilité pour les transactions suivantes.
WITH HOLD n'est pas utilisable quand la requĂȘte contient dĂ©jĂ FOR UPDATE ou FOR SHARE.
L'option SCROLL est nĂ©cessaire Ă la dĂ©finition de curseurs utilisĂ©s en rĂ©cupĂ©ration remontante (retour dans la liste des rĂ©sultats, backward fetch), comme prĂ©cisĂ© par le standard SQL. NĂ©anmoins, pour des raisons de compatibilitĂ© avec les versions antĂ©rieures, PostgreSQLâą autorise les rĂ©cupĂ©rations remontantes sans que l'option SCROLL ne soit prĂ©cisĂ©, sous rĂ©serve que le plan d'exĂ©cution du curseur soit suffisamment simple pour ĂȘtre gĂ©rĂ© sans surcharge. Toutefois, il est fortement conseillĂ© aux dĂ©veloppeurs d'application ne pas utiliser les rĂ©cupĂ©rations remontantes avec des curseurs qui n'ont pas Ă©tĂ© créés avec l'option SCROLL. Si NO SCROLL est spĂ©cifiĂ©, les rĂ©cupĂ©rations remontantes sont toujours dĂ©validĂ©es.
Les parcours inverses sont aussi interdits lorsque la requĂȘte inclut les clauses FOR UPDATE et FOR SHARE ; donc SCROLL peut ne pas ĂȘtre indiquĂ© dans ce cas.
Les curseurs scrollables et avec l'option WITH HOLD pourraient donner des rĂ©sultats inattendues s'ils font appel Ă des fonctions volatiles (voir Section 35.6, « CatĂ©gories de volatilitĂ© des fonctions »). Quand une ligne prĂ©cĂ©demment rĂ©cupĂ©rĂ©e est de nouveau rĂ©cupĂ©rĂ©e, la fonction pourrait ĂȘtre rĂ©-exĂ©cutĂ©e, amenant peut-ĂȘtre des rĂ©sultats diffĂ©rentes de la premiĂšre exĂ©cution. Un contournement est de dĂ©clarer le curseur WITH HOLD et de valider la transaction avant de lire toute ligne de ce curseur. Cela forcera la sortie entiĂšre du cuseur Ă ĂȘtre matĂ©rialisĂ©e dans un stockage temporaire, pour que les fonctions volatiles soient exĂ©cutĂ©es exactement une fois pour chaque ligne.
Si la requĂȘte du curseur inclut les clauses FOR UPDATE ou FOR SHARE, alors les lignes renvoyĂ©es sont verrouillĂ©es au moment oĂč elles sont rĂ©cupĂ©rĂ©es, de la mĂȘme façon qu'une commande SELECT(7) standard avec ces options. De plus, les lignes renvoyĂ©es seront les versions les plus Ă jour ; du coup, ces options fournissent l'Ă©quivalent de ce que le standard SQL appelle un « curseur sensible ». (Indiquer INSENSITIVE avec soit FOR UPDATE soit FOR SHARE est une erreur.)
Il est gĂ©nĂ©ralement recommandĂ© d'utiliser FOR UPDATE si le curseur doit ĂȘtre utilisĂ© avec UPDATE ... WHERE CURRENT OF ou DELETE ... WHERE CURRENT OF. Utiliser FOR UPDATE empĂȘche les autres sessions de modifier les lignes entre le moment oĂč elles sont rĂ©cupĂ©rĂ©es et celui oĂč elles sont modifiĂ©es. Sans FOR UPDATE, une commande WHERE CURRENT OF suivante n'aura pas d'effet si la ligne a Ă©tĂ© modifiĂ©e depuis la crĂ©ation du curseur.
Une autre raison d'utiliser FOR UPDATE est que, sans ce dernier, un appel suivant Ă WHERE CURRENT OF pourrait Ă©chouer si la requĂȘte curseur ne rĂ©pond pas aux rĂšgles du standard SQL d'ĂȘtre « mise Ă jour simplement » (en particulier, le curseur doit rĂ©fĂ©rencer une seule table et ne pas utiliser de regroupement ou de tri comme ORDER BY). Les curseurs qui ne peuvent pas ĂȘtre mis Ă jour pourraient fonctionner, ou pas, suivant les dĂ©tails du plan choisi ; dans le pire des cas, une application pourrait fonctionner lors des tests puis Ă©chouer en production.
La principale raison de ne pas utiliser FOR UPDATE avec WHERE CURRENT OF est si vous avez besoin que le curseur soit déplaçable ou qu'il soit insensible aux mises à jour suivantes (c'est-à -dire qu'il continue à afficher les anciennes données). Si c'est un prérequis, faites trÚs attention aux problÚmes expliqués ci-dessus.
Le standard SQL ne mentionne les curseurs que pour le SQL embarquĂ©. PostgreSQLâą n'implante pas l'instruction OPEN pour les curseurs ; un curseur est considĂ©rĂ© ouvert Ă sa dĂ©claration. NĂ©anmoins, ECPG, le prĂ©processeur de SQL embarquĂ© pour PostgreSQLâą, supporte les conventions du standard SQL relatives aux curseurs, dont celles utilisant les instructions DECLARE et OPEN.
Vous pouvez voir tous les curseurs disponibles en exĂ©cutant une requĂȘte sur la vue systĂšme pg_cursors.
Déclarer un curseur :
DECLARE liahona CURSOR FOR SELECT * FROM films;
Voir FETCH(7) pour plus d'exemples sur l'utilisation des curseurs.
Le standard SQL indique que la sensibilitĂ© des curseurs aux mises Ă jour en parallĂšle des donnĂ©es rĂ©cupĂ©rĂ©es est dĂ©pendante de l'implantation par dĂ©faut. Dans PostgreSQLâą, les curseurs n'ont pas ce comportement par dĂ©faut, mais peuvent le devenir en ajoutant FOR UPDATE. D'autres produits peuvent gĂ©rer cela diffĂ©rement.
Le standard SQL n'autorise les curseurs que dans le SQL embarqué et dans les modules. PostgreSQL⹠permet une utilisation interactive des curseurs.
Le standard SQL autorise les curseurs à mettre à jour les données d'une table. Tous les curseurs PostgreSQL⹠sont en lecture seule.
Les curseurs binaires sont une extension PostgreSQLâą.