supprimé
normal, en plpgsql tu ne peux pas retourner directement un result de requete, ca marche en language SQL mais là non, pour cela il faut que tu utilise LOOP
exemple d'utilisation :
http://postgresql.developpez.com/faq...kees#appelproc
en regardant vite fait ton code, tu y gagnerai de la passer en requete dynamique puisque que tu n'as que AND b.inscrit_genre = $1 qui change...
Salut,
alors pour une requete dynamique, il faut utiliser un curseur (il y a peut une meilleure facon)
je n'ai pas testé, dis moi si ca marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 CREATE OR REPLACE FUNCTION "public"."fonc_obtenir_profil_region_online_tab_bord" (inscrit_genre_arg integer, inscrit_region_id_arg bigint, inscrit_age_min_arg integer, inscrit_age_max_arg integer, inscrit_en_ligne_date_connexion_arg bigint, limit_arg integer, offset_arg integer) RETURNS SETOF "public"."type_select_profil_region_online_tab_bord" AS $body$ DECLARE curs1 refcursor; rec record; requete text; BEGIN requete:='SELECT inscrit_id,inscrit_pseudo,inscrit_age,media_inscrit_url_standard FROM inscrit_en_ligne a,inscrit b,media_inscrit c '; requete:=requete||' WHERE b.inscrit_id = a.inscrit_en_ligne_inscrit_id AND b.inscrit_id = c.media_inscrit_inscrit_id'; IF $1 <>3 THEN requete:=requete||' AND b.inscrit_genre = '||$1; END IF; requete:=requete||' AND b.inscrit_region_id = '||$2||' AND b.inscrit_age BETWEEN '||$3||' AND '||$4||' AND c.media_inscrit_type = ''PHOTO'' '; requete:=requete||' AND c.media_inscrit_rang = 1 AND a.inscrit_en_ligne_date_connexion > '||$5||' LIMIT '||$6||' OFFSET '||$7; OPEN curs1 FOR EXECUTE requete; LOOP FETCH curs1 INTO rec; IF NOT FOUND THEN EXIT; END IF; return next rec; END LOOP; return ; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
je me suis mis dans ma todolist pour la faq --> faire un exemple de requete dynamique
Bonjour,
a priori, il n'est pas nécessaire d'utiliser un curseur pour parcourir une requête dynamique ; un FOR - IN - EXECUTE devrait faire l'affaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 CREATE OR REPLACE FUNCTION "public"."fonc_obtenir_profil_region_online_tab_bord" (inscrit_genre_arg integer, inscrit_region_id_arg bigint, inscrit_age_min_arg integer, inscrit_age_max_arg integer, inscrit_en_ligne_date_connexion_arg bigint, limit_arg integer, offset_arg integer) RETURNS SETOF "public"."type_select_profil_region_online_tab_bord" AS $body$ DECLARE rec type_select_profil_region_online_tab_bord%rowtype; requete text; BEGIN requete:='SELECT inscrit_id,inscrit_pseudo,inscrit_age,media_inscrit_url_standard FROM inscrit_en_ligne a,inscrit b,media_inscrit c '; requete:=requete||' WHERE b.inscrit_id = a.inscrit_en_ligne_inscrit_id AND b.inscrit_id = c.media_inscrit_inscrit_id'; IF $1 <>3 THEN requete:=requete||' AND b.inscrit_genre = '||$1; END IF; requete:=requete||' AND b.inscrit_region_id = '||$2||' AND b.inscrit_age BETWEEN '||$3||' AND '||$4||' AND c.media_inscrit_type = ''PHOTO'' '; requete:=requete||' AND c.media_inscrit_rang = 1 AND a.inscrit_en_ligne_date_connexion > '||$5||' LIMIT '||$6||' OFFSET '||$7; FOR rec IN EXECUTE requete LOOP RETURN NEXT rec; END LOOP; return ; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
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
effectivement ca marche autant pour moi![]()
il devait y avoir une raison, mais je sais plus laquelle.
Partager