Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/06/2007, 11h28   #1
Membre à l'essai
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 67
Points : 21
Points : 21
Par défaut pb fonction plpgsql qui renvoi SETOF record

Bonjour, voilà je cherche à faire une fonction plpgsql qui renvoi un liste d'enregistrement qui serront traiter par une autre fonction "générique".

La premiere étant pour renvoyé la liste des société avec leur nombre total de connexion sur une période donner.

La seconde donne la liste des 10 meilleurs (générique car elle poura faire la même chose avec les marques, etc.. utilisé dans la base)


Seulement voilà je n'arrive déjà pas à faire la première correctement

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE OR REPLACE FUNCTION meilleur_societe(integer, integer, integer, integer) returns setof record
AS
$$
declare
annee alias FOR $1;
mois1 alias FOR $2;
mois2 alias FOR $3;
soc_id alias FOR $4;
liste record;
begin
FOR liste IN SELECT stats_soc_id AS ID, sum(stats_soc_val) AS TOT
	FROM stats_societe
	WHERE extract(month FROM stats_soc_periode) BETWEEN mois1 AND mois2
	AND extract(year FROM stats_soc_periode) = annee
	AND stats_soc_id <> soc_id
	GROUP BY stats_soc_id
loop
	RETURN next liste;
end loop;
RETURN;
end;
$$
LANGUAGE'plpgsql';
quand je fais
Code :
SELECT meilleur_societe(2007, 5, 8, 444) AS blob;
j'ai :
ERROR: set-valued function called in context that cannot accept a set
État SQL :0A000
Contexte : PL/pgSQL function "meilleur_societe" line 15 at return next


par contre si je fais la "requete" SQL directement avec les paramètres (hors fonction donc) j'ai bien ce que je veux.

Mon pb est donc que je ne sais pas comment renvoyer un record de 1 ou plusieur ligne correctement.


Merci pour votre aide
bossLINDROS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 14h14   #2
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

question classique.

A partir du moment où une procédure stockée renvoie un jeu d'enregistrement, elle est considérée comme une table d'un point de vue SQL. En conséquence, on la trouve dans la clause FROM de la requête SQL. D'autre part, du fait qu'elle renvoie un type RECORD générique, il faut indiquer le type et le nom des champs renvoyés (les noms ne sont pas obligés de concorder avec ceux utilisés dans la fonction, par contre les types doivent être compatibles). Ce qui donne :
Code :
SELECT * FROM meilleur_societe(2007, 5, 8, 444) AS (id integer, tot integer);
D'autre part, il était inutile d'utiliser plpgsql pour écrire ta fonction, SQL aurait été suffisant.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2007, 14h41   #3
Membre à l'essai
 
Inscription : août 2006
Messages : 67
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 67
Points : 21
Points : 21


merci bien ca marche nikel ^^
bossLINDROS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h50.


 
 
 
 
Partenaires

Hébergement Web