Pages: 1
- Sujet précédent - Recuperer les donnees d'une table dans une fonction en POSTGRESQL - Sujet suivant
#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: 1554
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: 1554
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
Pages: 1
- Sujet précédent - Recuperer les donnees d'une table dans une fonction en POSTGRESQL - Sujet suivant