Bonjour à tous,

Nouveau jour, nouvelle question.

Sur un projet j'ai la requête suivante :
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
31
32
33
34
select c.ident as ident,
	com.commune as commune,
	com.postal as postal,
	com.insee as insee,
	pm.zapm as pm,
	ch1.ident as ch_boite1,
	b1.ident as nom_boite1,
	ch2.ident as ch_boite2,
	b2.ident as nom_boite2, 
	c.finbt as capacite,
	c.longueur as longueur,
	c.dsig as date_dsig,
	s.nb_supp as nb_supports,
	c.firol_libe as role_fibre,
	ch.id_releve as releve_lie,
	nc.id_conception as dos_conception_lie,
	cc.fci as num_fci,
	co.etat_webop as etat_ca,
	co.date_valid_c9 as date_c9
from "siea_s_fibrvue.v_ca_assemble_cable" c
left join liste_communes com on right(c.insee,5) = com.insee
left join "siea_s_fibrza.geo_zapm_mcr" pm on st_intersects(c.geom,pm.geom)
left join "siea_s_fibrvue.v_gc_assemble_chambre" ch1 on st_dwithin(st_startpoint(c.geom),ch1.geom,0.2)
left join "siea_s_fibrvue.v_gc_assemble_chambre" ch2 on st_dwithin(st_endpoint(c.geom),ch2.geom,0.2)
left join "siea_s_fibrvue.v_ca_assemble_boitier" b1 on st_dwithin(st_startpoint(c.geom),b1.geom,0.2)
left join "siea_s_fibrvue.v_ca_assemble_boitier" b2 on st_dwithin(st_endpoint(c.geom),b2.geom,0.2)
left join (SELECT c.ident, COUNT(s.ident) as nb_supp
		from "siea_s_fibrvue.v_ca_assemble_cable" c
		left join "siea_s_fibrvue.v_gc_assemble_support" s on st_dwithin(c.geom,s.geom,0.2)
		group by c.ident) s on s.ident = c.ident
left join suivi_non_conformites nc on nc.cable = c.ident
left join suivi_chambres ch on nc.siea = ch.id_siea
left join suivi_cables_commandes cc on cc.id_cable = c.ident
left join suivi_commandes co on co.fci = cc.fci
Comme vous pouvez le voir elle n'a rien de très compliquée, je récupère juste tous les cables d'une table et ensuite je vais piocher dans plusieurs tables des infos complémentaires.

Cette requête est exploitée par un fichier excel donc codé en vba. Et pour faire un truc plus propre, éviter les doublons, etc, je voulais tranformer cette requête en une fonction intégrée directement à la base.
Pour cela j'ai utilisé la fonction create suivante :
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
create type cable as (ident character varying(40),
				commune character varying(254),
				postal character varying(254),
				insee character varying(254),
				pm character varying(80),
				ch_boite1 character varying(40),
				nom_boite1 character varying(40),
				ch_boite2 character varying(40),
				nom_boite2 character varying(40), 
				capacite numeric(10,0),
				longueur numeric,
				date_dsig character varying(80),
				nb_supports numeric,
				role_fibre character varying(254),
				releve_lie character varying(254),
				dos_conception_lie character varying(254),
				num_fci character varying(254),
				etat_ca character varying(254),
				date_c9 date);
 
 
CREATE OR REPLACE FUNCTION public.Get_Cables() RETURNS SETOF cable AS 
$BODY$
	DECLARE
 
	BEGIN
			select c.ident as ident,
				com.commune as commune,
				com.postal as postal,
				com.insee as insee,
				pm.zapm as pm,
				ch1.ident as ch_boite1,
				b1.ident as nom_boite1,
				ch2.ident as ch_boite2,
				b2.ident as nom_boite2, 
				c.finbt as capacite,
				c.longueur as longueur,
				c.dsig as date_dsig,
				s.nb_supp as nb_supports,
				c.firol_libe as role_fibre,
				ch.id_releve as releve_lie,
				nc.id_conception as dos_conception_lie,
				cc.fci as num_fci,
				co.etat_webop as etat_ca,
				co.date_valid_c9 as date_c9
			from "siea_s_fibrvue.v_ca_assemble_cable" c
			left join liste_communes com on right(c.insee,5) = com.insee
			left join "siea_s_fibrza.geo_zapm_mcr" pm on st_intersects(c.geom,pm.geom)
			left join "siea_s_fibrvue.v_gc_assemble_chambre" ch1 on st_dwithin(st_startpoint(c.geom),ch1.geom,0.2)
			left join "siea_s_fibrvue.v_gc_assemble_chambre" ch2 on st_dwithin(st_endpoint(c.geom),ch2.geom,0.2)
			left join "siea_s_fibrvue.v_ca_assemble_boitier" b1 on st_dwithin(st_startpoint(c.geom),b1.geom,0.2)
			left join "siea_s_fibrvue.v_ca_assemble_boitier" b2 on st_dwithin(st_endpoint(c.geom),b2.geom,0.2)
			left join (SELECT c.ident, COUNT(s.ident) as nb_supp
					from "siea_s_fibrvue.v_ca_assemble_cable" c
					left join "siea_s_fibrvue.v_gc_assemble_support" s on st_dwithin(c.geom,s.geom,0.2)
					group by c.ident) s on s.ident = c.ident
			left join suivi_non_conformites nc on nc.cable = c.ident
			left join suivi_chambres ch on nc.siea = ch.id_siea
			left join suivi_cables_commandes cc on cc.id_cable = c.ident
			left join suivi_commandes co on co.fci = cc.fci;
		RETURN;
	END;
	$BODY$
  LANGUAGE plpgsql;
ALTER FUNCTION public.Get_Cables()
  OWNER TO postgres;
Toute la création se passe bien mais une fois que j'exécute la fonction avec le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select * from get_cables(NULL);
J'ai les erreurs suivantes :
ERREUR: la requête n'a pas de destination pour les données résultantes
HINT: Si vous voulez annuler les résultats d'un SELECT, utilisez PERFORM à la place.
CONTEXT: fonction PL/pgsql get_cables(character varying), ligne 8 à instruction SQL
********** Erreur **********

ERREUR: la requête n'a pas de destination pour les données résultantes
État SQL :42601
Astuce : Si vous voulez annuler les résultats d'un SELECT, utilisez PERFORM à la place.
Contexte : fonction PL/pgsql get_cables(character varying), ligne 8 à instruction SQL
Et j'arrive pas à comprendre pourquoi.

Donc déjà pensez-vous que l'idée de mettre cette requête dans une fonction est une bonne idée ?
Et si oui savez-vous me dire si je suis obligé de passé par un type ceble comme je l'ai défini au départ ?
Et enfin sauriez-vous pourquoi j'ai cette erreur ?