PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 27/05/2010 11:40:12

Slayne
Membre

Utiliser un cursor pour éviter un "out of memory"

Bonjour,

Je tente de faire un requete avec beaucoup de résultats sur une base de données postgreSQL, mais malheureusement j'obtiens le message "out of memory for query result" avant d'arriver à la fin de celle ci.
Le fautif semble être le côté client qui tente de stocker tous les resultats et crash au bout d'une quinzaine de minutes.
J'ai cru comprendre que les cursors sont une solution pour éviter ce soucis, mais j'ai de la peine à le mettre en oeuvre.

DECLARE
result CURSOR FOR SELECT id FROM input WHERE size > 20000;
BEGIN
OPEN result;
LOOP
???
END LOOP;
CLOSE result;
END;

Mon probleme est: Qu'est ce que je dois mettre dans le LOOP pour traiter les resultats par lot de 1000 par exemple ? Et pour les afficher comme une requete classique ?

Merci !
slayne

Hors ligne

#2 27/05/2010 11:56:42

gleu
Administrateur

Re : Utiliser un cursor pour éviter un "out of memory"

Vous ne pouvez pas les traiter par lot. Par contre, vous pouvez les lire une à une avec FETCH par exemple.


Guillaume.

Hors ligne

#3 27/05/2010 14:28:45

Slayne
Membre

Re : Utiliser un cursor pour éviter un "out of memory"

J'y suis arrivé avec un FETCH et une boucle comme ça.
LOOP
   FETCH next_row INTO row;
   EXIT WHEN NOT FOUND;
   RAISE NOTICE ''id = %'', row.id;
END LOOP;

Malheureusement le RAISE NOTICE n'est pas vraiment l'équivalent de la sortie classique d'une requete psql.
Il y a un autre moyen pour afficher le résultat ?

Hors ligne

#4 27/05/2010 14:50:51

gleu
Administrateur

Re : Utiliser un cursor pour éviter un "out of memory"

Il faut créer une fonction SETOF (pour indiquer à PostgreSQL que la fonction renvoie plusieurs lignes) et utiliser RETURN NEXT pour chaque ligne à renvoyer.


Guillaume.

Hors ligne

Pied de page des forums