Je rencontre une difficulté étant novice sur PostgreSQL. J'utilise la version 11.
Voici mon problème :
- je créé un trigger comme suis :
- Voici le le code de la fonction appelée suite au déclenchement de l'évènement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 DROP TRIGGER coupurelaser_afterupdate ON "GESTION_QUAIS"."CoupureLaser"; create trigger coupurelaser_afterupdate after update on "GESTION_QUAIS"."CoupureLaser" for each row when ((new."DateHeureOff" is not null and old."DateHeureOff" is null)) execute procedure "GESTION_QUAIS".apresupdatecoupurelaser();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 CREATE OR REPLACE FUNCTION "GESTION_QUAIS".apresupdatecoupurelaser() RETURNS trigger LANGUAGE plpgsql AS $function$ declare ilIDT_VEHICULES_SUR_SITE INT8 ; dtDateHeureOff timestamp ; ilIDT_MOUVEMENTS_DU_JOUR INT8 ; ilNumVoie INT4 ; begin ilIDT_VEHICULES_SUR_SITE := new."IDT_VEHICULES_SUR_SITE"; dtDateHeureOff := new."DateHeureOff"; ilIDT_MOUVEMENTS_DU_JOUR := new."IDT_MOUVEMENTS_DU_JOUR"; ilNumVoie := new."NUMERO_VOIE"; if new."IDT_MOUVEMENTS_DU_JOUR" is not null AND new."IDT_MOUVEMENTS_DU_JOURDepart" is not null then -- c'est un via update "GESTION_QUAIS"."T_MOUVEMENTS_DU_JOUR" as mvtj set mvtj."ETAT"=8, mvt."HEURE_DEPART_EFFECTUEE" = "GESTION_QUAIS".TimeOffDatetime(dtDateHeureOff) where mvtj."IDT_MOUVEMENTS_DU_JOUR" = ilIDT_MOUVEMENTS_DU_JOUR; update "GESTION_QUAIS"."T_QUAIS" as quais set quais."OCCUPATION_QUAI" = '0', quais ."QUI_OCCUPE" = null, quais ."HEURE_LIBERATION_PREVUE" =null, quais ."IDT_MOUVEMENTS_DU_JOUR" = null where quais ."NUM_QUAI_SHAKTIWARE" = ilNumVoie; else if new."NUMERO_VOIE" = 129 then -- quai de lavage if new."IDT_MOUVEMENTS_DU_JOUR" is not null and new."IDT_MOUVEMENTS_DU_JOURDepart" is null then -- c'est un mouvement simple : arrivée ou départ update "GESTION_QUAIS"."T_MOUVEMENTS_DU_JOUR" as mvtj set mvtj."ETAT"=1, mvt."HEURE_DEPART_EFFECTUEE" = null where mvtj."IDT_MOUVEMENTS_DU_JOUR" = ilIDT_MOUVEMENTS_DU_JOUR and mvtj."ETAT" = 8; end if; else if new."IDT_MOUVEMENTS_DU_JOUR" is not null and new."IDT_MOUVEMENTS_DU_JOURDepart" is null then -- c'est un mouvement simple : arrivée ou départ update "GESTION_QUAIS"."T_MOUVEMENTS_DU_JOUR" as mvtj set mvtj."ETAT"=8, mvt."HEURE_DEPART_EFFECTUEE" = "GESTION_QUAIS".TimeOffDatetime(dtDateHeureOff) where mvtj."IDT_MOUVEMENTS_DU_JOUR" = ilIDT_MOUVEMENTS_DU_JOUR; update "GESTION_QUAIS"."T_QUAIS" as quais set quais."OCCUPATION_QUAI" = '0', quais ."QUI_OCCUPE" = null, quais ."HEURE_LIBERATION_PREVUE" = null, quais ."IDT_MOUVEMENTS_DU_JOUR" = null where quais ."NUM_QUAI_SHAKTIWARE" = ilNumVoie; end if; end if; end if; return new; END; $function$ ;
Voici l'erreur renvoyée par PostgreSQL dans le cas ou est demandé le update sur 2 tables différentes de la table ou est levé l'évènement :
Error synchronizing data with database
Motif:
SQL Error [0A000]: ERREUR: les fonctions renvoyant un ensemble ne sont pas autorisés dans UPDATE
Où*: fonction PL/pgsql "GESTION_QUAIS".apresupdatecoupurelaser(), ligne 23 à instruction SQL
Mon besoin :
- comprendre la cause de cette erreur.
- comment la levée.
Je vous remercie de votre lecture et de vos lumières.
Partager