Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1