Pages: 1
- Sujet précédent - PostgreSQL - Fonction Trigger d'insert en boucle depuis autres tables - Sujet suivant
#1 Sat 13 August 2022 01:20
- Maverick83000
- Participant occasionnel
- Lieu: Toulon
- Date d'inscription: 23 Jul 2014
- Messages: 10
PostgreSQL - Fonction Trigger d'insert en boucle depuis autres tables
Bonjour à tous,
J’ai essayé de trouver des réponses sur les forums et faire des tests sans succès donc je m’en remets à vous. Pour le contexte, on organise des concours de pronostiques avec des amis et cette année, je saute le pas de la base de données et du BI pour retranscrire les résultats.
J’ai une version 11 de Postgresql et je cherche à créer une fonction Trigger qui me permettra d’insérer, à chaque ajout de match dans la table top14, autant de lignes qu’il y a de pronostiqueurs dans la table pronostics_matchs tout en intégrant les informations de ces 2 tables.
J’ai une première table de pronostiqueurs :
Code:
CREATE TABLE pronostiqueurs ( id_pronostiqueur varchar(20) NULL, prenom varchar(50) NULL, nom varchar(50) NULL ); INSERT INTO pronostiqueurs VALUES ('U1', 'Hendrix', 'Jimmy'), ('U2', 'Lennon', 'John'), ('U3', 'Dickinson', 'Bruce');
Une seconde table de compétition Top14 (et ouais le monde de l'ovalie) :
Code:
CREATE TABLE top14 ( id_match varchar(50), competition varchar(30), journee varchar(10), num_match varchar(10), equipe_dom varchar(30), score_dom float8, bonus_off_dom boolean, equipe_ext varchar(30), score_ext float8, bonus_off_ext boolean, date_match timestamp );
Une dernière table qui regroupe chacun des matchs dupliqués pour autant de pronostiqueurs :
Code:
CREATE TABLE pronostics_matchs ( id_prono varchar(50), id_match varchar(50), competition varchar(30), journee varchar(10), num_match varchar(10), id_pronostiqueur varchar(30), equipe_dom varchar(30), score_dom float8, bonus_dom boolean, equipe_ext varchar(30), score_ext float8, bonus_ext boolean );
Voilà la fonction trigger qui semble marcher à moitié car elle ne me renvoie qu’une seule ligne entièrement remplie :
Code:
CREATE OR REPLACE FUNCTION ajouter_matchspronos() RETURNS trigger AS $BODY$ DECLARE prono_rec RECORD; BEGIN FOR prono_rec IN SELECT id_pronostiqueur from pronostiqueurs LOOP insert into pronostics_matchs (id_match,competition,journee,num_match,id_parieur,equipe_dom,equipe_ext) VALUES(new.id_match,new.competition,new.journee,new.num_match, prono_rec.id_pronostiqueur, new.equipe_dom,new.equipe_ext); return NEW; END LOOP; END; $BODY$ LANGUAGE plpgsql; DROP TRIGGER ajouter_matchspronos ON top14; CREATE TRIGGER ajouter_matchspronos AFTER INSERT ON top14 FOR EACH ROW EXECUTE PROCEDURE ajouter_matchspronos();
Tentative d’insertion qui doit (théoriquement) venir alimenter la table pronostics_matchs en y intégrant les pronostiqueurs
insert into top14
Code:
(competition,journee,num_match,equipe_dom,equipe_ext,date_match) values ('TOP14','J1','M1','RCT','ASM','2022-09-18 20:45:00')
En vous remerciant grandement par avance pour vos lumières. Si vous souhaitez des précisions, je suis à votre service.
Bonne soirée
Hors ligne
#2 Sat 13 August 2022 10:18
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostgreSQL - Fonction Trigger d'insert en boucle depuis autres tables
Ah, voila une chouette problématique.
Meme pas besoin de faire une BD, c'est le ST cette année
Hors ligne
#3 Sun 14 August 2022 13:40
- Maverick83000
- Participant occasionnel
- Lieu: Toulon
- Date d'inscription: 23 Jul 2014
- Messages: 10
Re: PostgreSQL - Fonction Trigger d'insert en boucle depuis autres tables
^^ Va falloir penser à en laisser pour les autres mais vu le recrutement, ça serait pas étonnant ! Surtout avec la coupe du monde à la fin de l'année !
Dans le principe, on a définit un barême avec attributions de points pour chacun des matchs. Chacun pronostique un résultat pour chaque match et on a une distribution de points (prorata du nombre de joueurs) en fonction du bon vainqueur du match, de l'écart des scores, d'un bon bonus offensif ou défensif (le score exact étant le Saint Graal).
De ce fait, j'aimerais, à chaque journée, lorsque j'intègre les 7 matchs, ne pas avoir à intégrer les 7 matchs x le nombre de participants en Insert into et l'option de la Fonction Trigger semble indispensable (J'en ai déjà 2 autres plus simple pour la création des id_match et id_pronostique)
Je ne suis pas un grand expert des fonctions je dois avouer (mais j'ai d'autres qualités promis )... Si vous avez une idée de ce qui cloche dans ma fonction ? On dirait qu'il récupère le premier élément de la table pronostiqueurs mais qu'il ne boucle pas.
Merci beaucoup
Hors ligne
#4 Tue 16 August 2022 12:07
Re: PostgreSQL - Fonction Trigger d'insert en boucle depuis autres tables
Bonjour,
Oui, problématique sympa
Il ne boucle pas car il y a un return à l'intérieur de la boucle.
Dernière modification par jmarsac (Tue 16 August 2022 12:08)
Jean-Marie
Azimut
Hors ligne
Pages: 1
- Sujet précédent - PostgreSQL - Fonction Trigger d'insert en boucle depuis autres tables - Sujet suivant