Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
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
Pages : 1