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 Fri 02 July 2021 17:02

tem76
Participant occasionnel
Lieu: Orange
Date d'inscription: 24 Jul 2006
Messages: 22

Postgresql/postgis : créer des tables à partir d'une liste de tables

Bonjour à tous.
Voici ma problématique :
j'ai, d'un côté, une liste de 6 tables contenant des grilles (10km, 5km, 2km, 1km, 500m et 200m).
De l'autre, j'ai une table d'iris contenant des analyses statistiques.
Je souhaite découper l'une avec l'autre de manière automatique avec un truc du genre :
je créé une table contenant la liste des tables qui me servent à découper ma table des iris :

Code:

drop table if exists temp.liste_grilles_hexagonales;
create table temp.liste_grilles_hexagonales (fid serial,nom_table varchar(50));
insert into temp.liste_grilles_hexagonales values 
    (1,'hexagrille_10km'),
    (2,'hexagrille_5km'),
    (3,'hexagrille_2km'),
    (4,'hexagrille_1km'),
    (5,'hexagrille_500m'),
    (6,'hexagrille_200m')
    ;

J'ai créé une fonction qui lit cette première table, découpe les tables et met le résultat de tout ça dans une nouvelle table.

Dans un premier temps, je suis parti d'une boucle juste pour créer une table pour chaque ligne :

Code:

create or replace function temp.lecture_grilles(force_drop int default 0)
returns void as
$body$
   declare echelle record;
   begin
      for echelle in select * from temp.liste_grilles_hexagonales loop
         execute format('drop table if exists %I','temp.'||echelle.nom_table||'_sql');
         execute format('create table %I (id serial primary key)','temp.'||echelle.nom_table||'_sql');
      end loop;
   end;
$body$ language plpgsql;

Mais cela ne fait rien : pas de table créée...

Auriez-vous une idée ?

Merci d'avance.

Hors ligne

 

#2 Fri 02 July 2021 17:29

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1149

Re: Postgresql/postgis : créer des tables à partir d'une liste de tables

Salut,

est ce que les tables ne seraient pas créées dans le schema public par hasard ?

Hors ligne

 

#3 Fri 02 July 2021 21:08

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1549

Re: Postgresql/postgis : créer des tables à partir d'une liste de tables

Bonsoir,

Perso, je mettrais toutes les grilles dans la même table.
le croisement pourrait se faire en une seule requete, sans passer par des fonctions.
Et le résultat stocké dans une seule table aussi, quitte à ventiler plus tard dans plusieurs tables

Nicolas

Hors ligne

 

#4 Mon 05 July 2021 09:05

tem76
Participant occasionnel
Lieu: Orange
Date d'inscription: 24 Jul 2006
Messages: 22

Re: Postgresql/postgis : créer des tables à partir d'une liste de tables

tumasgiu a écrit:

Salut,

est ce que les tables ne seraient pas créées dans le schema public par hasard ?


Et bien, effectivement, elles sont dans le schéma "public". Pourtant, j'ai bien mis 'temp.' pour qu'elles aillent dans le schéma 'temp', justement. Quelle erreur ai-je fait ?

Hors ligne

 

#5 Mon 05 July 2021 09:17

Ben22
Participant actif
Lieu: 33
Date d'inscription: 11 May 2016
Messages: 96

Re: Postgresql/postgis : créer des tables à partir d'une liste de tables

Bonjour,

Je me demande si la syntaxe 'temp.'||echelle.nom_table||'_sql' ne génère pas trop de point positionnant temp comme une base de données et non un schéma.

Essayez peut-être de stocker "echelle.nom_table" dans une variable text au sein de la boucle pour la réutiliser dans l'insert afin d’éliminer cette hypothèse.

Bien à vous

Hors ligne

 

#6 Mon 05 July 2021 10:34

tem76
Participant occasionnel
Lieu: Orange
Date d'inscription: 24 Jul 2006
Messages: 22

Re: Postgresql/postgis : créer des tables à partir d'une liste de tables

Ben22 a écrit:

Bonjour,

Je me demande si la syntaxe 'temp.'||echelle.nom_table||'_sql' ne génère pas trop de point positionnant temp comme une base de données et non un schéma.

Essayez peut-être de stocker "echelle.nom_table" dans une variable text au sein de la boucle pour la réutiliser dans l'insert afin d’éliminer cette hypothèse.

Bien à vous


Ok. Du coup, j'ai créé une variable pour récupérer le nom de la table et ça à l'air de fonctionner :

Code:

create or replace function temp.lecture_grilles(force_drop int default 0)
returns void as
$body$
   declare echelle record;
   declare nomtable text; 
   begin
      for echelle in select * from temp.liste_grilles_hexagonales loop
         nomtable := echelle.nom_table;
         raise info 'A2 Suppression de la table temp.%_sql',nomtable;
         execute format('drop table if exists temp.%I',nomtable||'_sql');
         execute format('create table temp.%I (id serial primary key)',nomtable||'_sql');
      end loop;
   end;
$body$ language plpgsql;

Merci pour l'info.

Par contre, quelle est la différence entre mettre '%' ou mettre '%I' pour récupérer la valeur d'une variable ?

Hors ligne

 

#7 Mon 05 July 2021 10:41

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1549

Re: Postgresql/postgis : créer des tables à partir d'une liste de tables

tem76 a écrit:

Par contre, quelle est la différence entre mettre '%' ou mettre '%I' pour récupérer la valeur d'une variable ?


Bonjour,

Pour laisser PG formater les identifiants (noms de tables, colonnes, schémas, etc.) comme il faut:

https://www.postgresql.org/docs/13/func … ING-FORMAT

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB