Pages: 1
- Sujet précédent - PL-PGSQL - Creer autant de tables que de valeurs d'un champ - Sujet suivant
#1 Wed 29 March 2023 17:44
- sigtdlu
- Juste Inscrit !
- Date d'inscription: 29 Mar 2023
- Messages: 3
PL-PGSQL - Creer autant de tables que de valeurs d'un champ
Bonjour,
J'ai une table SERVITUDE avec un champ SUPTYPE qui renseigne le type de servitude et souhaiterais, par une fonction trigger, créer autant de tables que ce qu'il y a de SUPTYPE.
Je présume devoir utiliser une boucle dans la fonction mais mes connaissances s'arrêtent là.
Quelqu'un pourrait-il m'aiguiller s'il vous plait ?
D'avance, merci, Bien cordialement, Alice
Hors ligne
#2 Wed 05 April 2023 13:42
- tweaxy
- Participant actif
- Lieu: Abbeville
- Date d'inscription: 27 Dec 2018
- Messages: 76
Re: PL-PGSQL - Creer autant de tables que de valeurs d'un champ
Bonjour,
Pourrions-nous avoir plus de précisions sur les attributs que doit contenir chaque table ?
Une fonction permettrait en effet de faire ça, en remplaçant a_test par votre nom de schéma et attribut1 etc. par les attributs que vous souhaitez dans vos tables :
CREATE OR REPLACE FUNCTION temp_create_table() RETURNS integer AS $$
DECLARE
v_count integer;
v_table record;
BEGIN
v_count := 0;
FOR v_table IN
SELECT DISTINCT "SURTYPE" as tablename
FROM a_test."SERVITUDE"
LOOP
EXECUTE 'CREATE TABLE IF NOT EXISTS a_test.' || quote_ident(v_table.tablename) || '(attribut1 serial, attribut2 text)';
v_count := v_count + 1;
END LOOP;
RETURN v_count;
END
$$ LANGUAGE 'plpgsql';
SELECT temp_create_table();
DROP FUNCTION temp_create_table();
A adapter également selon les contraintes que vous voulez appliquer.
Cordialement,
Léandre BERON
Hors ligne
#3 Tue 11 April 2023 14:03
- sigtdlu
- Juste Inscrit !
- Date d'inscription: 29 Mar 2023
- Messages: 3
Re: PL-PGSQL - Creer autant de tables que de valeurs d'un champ
Bonjour,
Merci beaucoup pour votre réponse et pour votre aide.
J'ai pu tester votre requête en l'adaptant à ma table.
Code:
DROP FUNCTION fn_assiette_sup_s(); CREATE OR REPLACE FUNCTION fn_assiette_sup_s() RETURNS integer AS $$ DECLARE v_count integer; v_table record; BEGIN v_count := 0; FOR v_table IN SELECT DISTINCT suptype as tablename FROM ref_gpu_sup_flux."wfs_sup:assiette_sup_s", ref_bd_admin_express_3_0_2021.ade_emprise_ptdl WHERE ST_INTERSECTS("wfs_sup:assiette_sup_s".geom, ade_emprise_ptdl.geom) LOOP EXECUTE 'CREATE TABLE IF NOT EXISTS ref_gpu_sup_flux.' || quote_ident(v_table.tablename) || '(geom geometry(MultiPolygon,2154), gid integer, suptype character varying, partition character varying, fichier character varying, idass character varying, idgen character varying, nomass character varying, typeass character varying, modegeoass character varying, paramcalc bigint, srcgeoass character varying, datesrcass character varying, angle1 bigint, angle2 bigint, rayon bigint, h double precision, href character varying, xdebut bigint, xfinal bigint, ydebut bigint, yfinal bigint, largeur bigint, nomsuplitt character varying)'; v_count := v_count + 1; END LOOP; RETURN v_count; END $$ LANGUAGE 'plpgsql'; SELECT fn_assiette_sup_s();
La requête fonctionne, cela crée autant de tables que de valeurs SUPTYPE.
Par contre les tables résultantes sont vides.
Dans la fonction, il y aurait il une façon de les remplir ?
Sinon je pourrais fairer un INSERT INTO par la suite mais cela perd un peu l'intérêt de créer une fonction.
Bien cordialement,
Alice
Dernière modification par sigtdlu (Tue 11 April 2023 14:12)
Hors ligne
#4 Tue 11 April 2023 16:02
- tweaxy
- Participant actif
- Lieu: Abbeville
- Date d'inscription: 27 Dec 2018
- Messages: 76
Re: PL-PGSQL - Creer autant de tables que de valeurs d'un champ
Bonjour,
Si vous voulez insérer les valeurs de votre table mère en fonction du type dans l'attribut SUPTYPE, il vous faut ajouter une nouvelle ligne d'EXECUTE avec de l'INSERT INTO et une condition WHERE SUPTYPE = v_table après la ligne de création de table (EXECUTE 'CREATE TABLE....')
Quelque chose comme ça :
EXECUTE 'INSERT INTO ref_gpu_sup_flux.' || quote_ident(v_table.tablename) || 'SELECT attribut1, attribut2 FROM ref_gpu_sup_flux."wfs_sup:assiette_sup_s" WHERE suptype = tablename';
Cordialement,
Léandre
Dernière modification par tweaxy (Tue 11 April 2023 16:07)
Hors ligne
#5 Thu 13 April 2023 14:23
- sigtdlu
- Juste Inscrit !
- Date d'inscription: 29 Mar 2023
- Messages: 3
Re: PL-PGSQL - Creer autant de tables que de valeurs d'un champ
Bonjour,
Suite à votre dernier message, j'ai modifié ma fonction et tout fonctionne bien. La voici :
Code:
CREATE OR REPLACE FUNCTION ref_gpu_sup_flux_tdlu.fn_assiette_sup_s() RETURNS integer AS $$ DECLARE v_count integer; v_table record; BEGIN v_count := 0; FOR v_table IN SELECT DISTINCT wfs_sup_assiette_sup_s.suptype as tablename FROM ref_gpu_sup_flux.wfs_sup_assiette_sup_s, ref_bd_admin_express_3_0_2021.ade_emprise_ptdl WHERE ST_INTERSECTS(wfs_sup_assiette_sup_s.geom, ade_emprise_ptdl.geom) LOOP EXECUTE 'CREATE TABLE IF NOT EXISTS ref_gpu_sup_fn.sup_' || quote_ident(v_table.tablename) || '_ass_s_gpu' || '(geom geometry(MultiPolygon,2154), gid integer, suptype character varying, partition character varying, fichier character varying, idass character varying, idgen character varying, nomass character varying, typeass character varying, modegeoass character varying, paramcalc bigint, srcgeoass character varying, datesrcass character varying, angle1 bigint, angle2 bigint, rayon bigint, h double precision, href character varying, xdebut bigint, xfinal bigint, ydebut bigint, yfinal bigint, largeur bigint, nomsuplitt character varying)'; EXECUTE 'INSERT INTO ref_gpu_sup_fn.sup_' || quote_ident(v_table.tablename) || '_ass_s_gpu' || ' SELECT wfs_sup_assiette_sup_s.geom, wfs_sup_assiette_sup_s.gid, wfs_sup_assiette_sup_s.suptype, wfs_sup_assiette_sup_s.partition, wfs_sup_assiette_sup_s.fichier, wfs_sup_assiette_sup_s.idass, wfs_sup_assiette_sup_s.idgen, wfs_sup_assiette_sup_s.nomass, wfs_sup_assiette_sup_s.typeass, wfs_sup_assiette_sup_s.modegeoass, wfs_sup_assiette_sup_s.paramcalc, wfs_sup_assiette_sup_s.srcgeoass, wfs_sup_assiette_sup_s.datesrcass, wfs_sup_assiette_sup_s.angle1, wfs_sup_assiette_sup_s.angle2, wfs_sup_assiette_sup_s.rayon, wfs_sup_assiette_sup_s.h, wfs_sup_assiette_sup_s.href, wfs_sup_assiette_sup_s.xdebut, wfs_sup_assiette_sup_s.xfinal, wfs_sup_assiette_sup_s.ydebut, wfs_sup_assiette_sup_s.yfinal, wfs_sup_assiette_sup_s.largeur, wfs_sup_assiette_sup_s.nomsuplitt FROM ref_gpu_sup_flux.wfs_sup_assiette_sup_s, ref_bd_admin_express_3_0_2021.ade_emprise_ptdl WHERE wfs_sup_assiette_sup_s.suptype = ''' || quote_ident(v_table.tablename) || ''' AND ST_INTERSECTS(wfs_sup_assiette_sup_s.geom, ade_emprise_ptdl.geom)'; v_count := v_count + 1; END LOOP; RETURN v_count; END $$ LANGUAGE 'plpgsql'; SELECT ref_gpu_sup_flux_tdlu.fn_assiette_sup_s();
J'ai ajouté la condition ST_INTERSECTS pour filtrer sur mon territoire.
Encore merci beaucoup pour votre aide.
Bien cordialement,
Alice
Dernière modification par sigtdlu (Thu 13 April 2023 14:24)
Hors ligne
Pages: 1
- Sujet précédent - PL-PGSQL - Creer autant de tables que de valeurs d'un champ - Sujet suivant