Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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é ?

Annonce

Printemps des cartes 2024

#1 Wed 20 July 2022 12:56

Fabrice1234
Juste Inscrit !
Date d'inscription: 20 Jul 2022
Messages: 1

Recuperer les donnees d'une table dans une fonction en POSTGRESQL

Bonjour à tous ,

Nouveau utilisateur de PostgreSQL , j'ai un problème  lorsque j'exécute des fonctions : je souhaiterais récupérer les données d'une  table déjà existante , qui ne comporte qu'une seule ligne , et qui contient tout les paramètres que je veux exploiter en tant que variables au sein de ma fonction .
Lorsque la table contenant les paramètres sera mise à jour , les variables de ma fonction doivent donc être mises à jour également .

Seulement , je n'arrive pas à trouver la syntaxe exacte pour faire appel à ces données : j'ai d'abord essayé d'indiquer uniquement le nom de la colonne dans ma fonction , mais j'obtiens un message d'erreur m'indiquant que la colonne n'est pas reconnue , j'ai essayé ensuite d'utiliser la syntaxe nom_de_table.nom_de_colonne pour reprendre la syntaxe qu'on utilise lorsque l'on fait des jointures entre les tables , mais j'obtiens un message d'erreur m'indiquant qu'il manque une clause "FROM " dans ma fonction .
En dernier recours , j'ai essayé d'utiliser la syntaxe NEW.nom_de_la_colonne , je n'obtiens pas de message d'erreur dans ce cas précis mais le code semble ne pas reconnaitre la valeur de la colonne que je souhaite utiliser puisqu'il fonctionne alors comme si mes paramètres valaient zéro .

Cependant , mon code fonctionne pour des valeurs discrètes ( en rentrant les paramètres manuellement  ) .

Ci joint , vous trouverez le code que je souhaite réaliser : le but étant de créer un réseau de table de panneaux photovoltaïques en fonction des différents paramètres du réseau ( dimensions des panneaux , distance inter-rangée , inter-table , nombre de panneaux en longueur , nombre de panneaux en hauteur )

(PS : la table que je souhaite utiliser est défini par :  parametrage_table ( id_parametrage_table SERIAL PRIMARY KEY , inter_rang REAL , inter_table REAL , longueur INT , hauteur INT , ht_table REAL ,l_table REAL )

CREATE OR REPLACE FUNCTION generer_tables() RETURNS TRIGGER AS $gt$
DECLARE
line_no int:= 0;
column_no int:= 0;
x real :=0;
y real :=0;
l_table real :=parametrage_table.l_table;                             
ht_table real :=parametrage_table.ht_table;
increment_x real :=0;
increment_y real :=0;
nom_polygone text :='' ;
hauteur int := parametrage_table.hauteur;
longueur int := parametrage_table.longueur ;
inter_rang real :=parametrage_table.inter_rang ;
inter_table real :=parametrage_table.inter_table ;
BEGIN
DROP TABLE referencement_tables ;
CREATE TABLE referencement_tables(id_table SERIAL primary KEY,geom geometry);
WHILE (line_no< hauteur) loop
      WHILE (column_no< longueur) loop
            column_no := column_no +1 ;
            increment_x :=x+l_table ;
            increment_y :=y+ht_table ;
            nom_polygone :=  'POLYGON'||'(('|| x ||' '|| y ||','||increment_x ||' '|| y ||','||increment_x||' '||increment_y||','||x||' '||increment_y||','||x||' '||y||'))'  ;
            INSERT INTO referencement_tables(geom)
            VALUES(ST_GeometryFromText(nom_polygone));
            x:= x+l_table+ inter_table;
            nom_polygone :='';
       END LOOP;
       column_no :=0;
       x:=0;
       line_no :=line_no+1 ;
       y:=y+ht_table+inter_rang;
END LOOP;
    return NEW;
END;
$gt$ language plpgsql ;

Merci d'avance , Fabrice

Hors ligne

 

#2 Wed 20 July 2022 14:02

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

Re: Recuperer les donnees d'une table dans une fonction en POSTGRESQL

Bonjour,

Dans votre cas, le plus simple est d'utiliser une variable de type RECORD qui va stocker toutes les valeurs de votre table de params (car celle-ci n'a qu'une ligne).
Vous pourrez ensuite utiliser la syntaxe record.column pour accéder à chaque colonne du record.

Ca ne se fait pas dans la partie DECLARE de la fonction, mais dans le corps de la fonction. La partie DECLARE sert juste à déclarer la variable de type RECORD:

Code:

DECLARE
...
v_rec record;
...
BEGIN
...
select * from parametrage_table into v_rec;
...

-- utilisation des valeurs:
x:= x+v_rec.l_table+ v_rec.inter_table;
...
END;

Vous pouvez aussi définir un type row à partir de votre table, mais je préfère souvent le type record pour des choses simples.
(https://www.postgresql.org/docs/14/plpg … ON-RECORDS)

Nicolas

Dernière modification par Nicolas Ribot (Wed 20 July 2022 14:03)

Hors ligne

 

#3 Wed 20 July 2022 14:11

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

Re: Recuperer les donnees d'une table dans une fonction en POSTGRESQL

Vous n'avez pas besoin de créer une fonction pour remplir la table referencement_tables.
Vous pouvez le faire à partir d'une requête SQL, en utilisant generate_series(1, hauteur) et generate_series(1, longueur).
Le SQL fait naturellement des boucles lorsqu'on accède plusieurs tables ou fonctions dans le FROM.

(pour construire votre polygone, vous pouvez aussi utiliser le constructeur BOX2D (box2d(xmin, ymin, xmax, ymax) et le caster en geometry pour avoir un polygone: box2d(...)::geometry.)

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB