banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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

 

Pied de page des forums

Powered by FluxBB