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 Re : PL/pgSQL » Utiliser un cursor pour éviter un "out of memory" » 27/05/2010 14:28:45

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 ?

#2 PL/pgSQL » Utiliser un cursor pour éviter un "out of memory" » 27/05/2010 11:40:12

Slayne
Réponses : 3

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

#3 Re : PL/pgSQL » Equivalent Postgre de cette requette » 22/05/2010 13:07:56

Effectivement j'ai pas adapté la requete du 1er message à mon example. J'ai modifié la clause where:
select @r := @r + 1, duration, @t := (@t + duration)/@r
  from input2Go
  where field1 = 1;

D'ou l'explication "La requete prend tous les 'field1' qui valent 1".

Je vais regarder cette requete window, merci !

#4 Re : PL/pgSQL » Equivalent Postgre de cette requette » 22/05/2010 12:04:19

En partant de données comme celle ci:

+--------+--------+
| field1 | field2 |
+--------+--------+
|      1 |      5 |
|      2 |      5 |
|      3 |      4 |
|      1 |      8 |
|      1 |      3 |
+--------+--------+

L'idée serait d'avoir une sortie comme ça:

+----------+--------+-------------+
| count?   | field2 | sum(field2) |
+----------+--------+-------------+
|        1 |      5 |           5 |
|        2 |      8 |          13 |
|        3 |      3 |          16 |
+----------+--------+-------------+

La requete prend tous les 'field1' qui valent 1. Il incremente un compteur (count) a chaque fois qu'il trouve, la deuxieme colonne est le 'field2' correspondant, et sum(field2) est la somme des field2 trouvé jusque là.

Merci de ton aide !
Slayne

#5 PL/pgSQL » Equivalent Postgre de cette requette » 21/05/2010 19:10:36

Slayne
Réponses : 6

Bonjour,

Je teste actuellement mysql et postgresql sur des "fausses données" que j'ai généré (juste pour comparer le fonctionnement des 2 systèmes), et il y a une requete que j'ai écris pour MySQL que j'ai de la peine à transformer pour MySQL.
Il est possible que je n'ai pas choisi le sous forum le plus approprié, si c'est le cas je déplacerai mon message.

Sur MySQL, ma requete ressemble à ça :
----------------------------------------------
set @r = 0;
set @t = 0;

select @r := @r + 1, duration, @t := (@t + duration)/@r
  from input2Go
  where field1 = 1;
----------------------------------------------
Pour PostgreSQL, je pense que l'initialisation des variables serait comme ceci:
\set r 0;
\set t 0;
Mais je ne vois pas comment faire l'équivalent du := de "@r := @r + 1".
J'ai essayé :r := :r + 1, mais sans succès.
Y t il une possibilité d'arriver au meme resultat ?

Merci
Slayne

Pied de page des forums

Propulsé par FluxBB