Vous n'êtes pas identifié(e).

#1 20/02/2017 06:54:13

Sadewizz
Membre

fonction qui renvoie une table

Bonjour,

je fais actuellement face à un soucis.
Je possède une table "source" qui contient des lignes que je dispatche par la suite dans d'autres tables via un attribut spécifique.

Ce que j'essaie d'avoir, c'est une comparaison entre ce qui existe dans la table source, et ce qui est exporté dans les autres tables afin de voir si il n'y a pas d'oublie (question de paranoïa).

la requête ci dessous me donne bien ce que je cherche mais uniquement entre deux tables (la table source et une seul table de dispatche):

select 
matable1.plandxf as plandxf, 
count(distinct matable1.gid) as table_destination, 
count(distinct matable2.gid) as table_source 
from monschema.matable1 
left join monschema.matable2 
on matable2.plandxf=matable1.plandxf 
group by matable1.plandxf

le résultat en sortie:

plandxf   table_destination  table_source
--------  -----------------  -------------
ACCEHAND  2112               2112         
GUE       59                 59
PASSEREL  773                773

j'ai donc essayé de créer une fonction qui me permettrais de factoriser cette requête et ainsi de comparer ma table source à toute mes tables de dispatches et qu'elle me sorte un tableaux similaire au précédent.
Je pourrais ainsi récupérer le résultat de cette requête via un autre logiciel métier.

Voici ma "fonction" actuelle. Elle ce lance mais ne ressort pas de résultat ni de tableaux...

CREATE OR REPLACE FUNCTION monschema.sig_count3()
  RETURNS TABLE(plandxf character varying, table character varying, c character varying) AS
$BODY$
DECLARE
liste RECORD;
BEGIN	

	FOR liste IN (select tablename from pg_tables where tablename = 'matable1')
	LOOP
	execute'select '
		||liste.tablename||'.plandxf as plandxf, 
		count(distinct '||liste.tablename||'.gid) as table_destination, 
		count(distinct matable2.gid) as table_source from monschema.'||liste.layer||' 
		left join monschema.matable2 
		on matable2.plandxf='||liste.tablename||'.plandxf 
		group by '||liste.tablename||'.plandxf;';
	END LOOP;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION monschema.sig_count3()
  OWNER TO postgres;

Si quelqu'un à la solution, je suis preneur wink
Merci à vous ^^

Sadewizz

Dernière modification par Sadewizz (20/02/2017 22:49:10)

Hors ligne

#2 20/02/2017 09:42:06

jmarsac
Membre

Re : fonction qui renvoie une table

Bonjour,
Cela ne répond pas exactement à la question sur la fonction, mais une solution est de faire une UNION de requêtes.

select 
matable1.plandxf as plandxf, 
count(distinct matable1.gid) as table_destination, 
count(distinct matable2.gid) as table_source 
from monschema.matable1 
left join monschema.matable2 
on matable2.plandxf=matable1.plandxf 
group by matable1.plandxf
UNION
select 
matable3.plandxf as plandxf, 
count(distinct matable3.gid) as table_destination, 
count(distinct matable2.gid) as table_source 
from monschema.matable3 
left join monschema.matable2 
on matable2.plandxf=matable3.plandxf 
group by matable3.plandxf
UNION
select 
matable4.plandxf as plandxf, 
count(distinct matable4.gid) as table_destination, 
count(distinct matable2.gid) as table_source 
from monschema.matable4 
left join monschema.matable2 
on matable2.plandxf=matable4.plandxf 
group by matable4.plandxf

Avec :
table source: matable2
tables destination : matable1, matable3, matable4
Avec une fonction, pour avoir un tableau de synthèse, il faudra de toute façon faire une UNION de requêtes

Dernière modification par jmarsac (20/02/2017 10:23:41)

Hors ligne

#3 20/02/2017 11:07:05

jmarsac
Membre

Re : fonction qui renvoie une table

Pour la fonction ce serait quelque chose du style (non testé):

CREATE OR REPLACE FUNCTION public.sig_count3(v_table_source  CHARACTER VARYING, v_table_dest character varying)
  RETURNS TABLE (plandxf  CHARACTER VARYING, nb_destination INTEGER, nb_source INTEGER) AS
$BODY$
BEGIN
	RETURN QUERY EXECUTE FORMAT('select 
	%I.plandxf as plandxf, 
	count(distinct %I.gid) as nb_destination, 
	count(distinct %I.gid) as nb_source 
	from %I 
	left join %I 
	on %I.plandxf = %I.plandxf 
	group by %I.plandxf',v_table_dest,v_table_dest,v_table_source,v_table_dest,v_table_source,v_table_source,v_table_dest,v_table_dest);
END
$BODY$
  LANGUAGE plpgsql;

qui pourrait être utilisée ainsi

  select * from sig_count3('matable2','matable1') UNION  select * from sig_count3('matable2','matable3');

Dernière modification par jmarsac (20/02/2017 11:07:26)

Hors ligne

Pied de page des forums