Bonjour,

Je viens vers vous car je galère sur une fonction associée à un trigger dont l'objectif est de mettre à jour une colonne d'une ligne en fonction de l'insert sur une table.

J'ai la requête SQL et elle fonctionne le problème c'est qu'elle n'est pas en automatique, d'où mon choix d'un trigger + fonction.

Voici la requête :

Voici les tables dont le nom est anonymisé : TABLE0 as D, TABLE1 as S, TABLE2 as C, TABLE3 as Z, TABLE4 as P

à savoir que :

TABLE0 comprends les colonnes D1, S1 et ID_D (qui est la clé) (et d'autre mais qui ne sont pas utile dans l'exemple)
TABLE 1 comprends la colonne utile S1 (et d'autre mais qui ne sont pas utile dans l'exemple)
TABLE2 comprends les colonnes Z1, S1 (et d'autre mais qui ne sont pas utile dans l'exemple)
TABLE3 comprends les colonnes P1, Z1 (et d'autre mais qui ne sont pas utile dans l'exemple)
TABLE4 comprends P1, ID_D (et d'autre mais qui ne sont pas utile dans l'exemple)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
UPDATE public.TABLE0 d SET d.S1 = 
(SELECT DISTINCT s.id_secteur 
FROM public.TABLE1 s, public.TABLE2 c, public.TABLE3 z, public.TABLE4 p
 WHERE z.P1 = p.P1
 AND p.ID_D = d.ID_D
 AND c.Z1 = z.Z1
 AND c.S1= s.S1
 AND d.ID_D = 'VALEURTEST')
WHERE d.ID_D = 'VALEURTEST'
J'ai traduit ainsi ma requête en fonction : la fonction sera rattachée à un trigger et à la table TABLE3 z

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
DECLARE
 
S1 INTEGER;
S1b INTEGER;
ID_D_CURRENT INTEGER;
ID_D INTEGER
Z1 VARCHAR;
 
BEGIN
  if (TG_OP = 'INSERT') AND new.Z1 like '%TAM%' THEN
S1b :=(SELECT DISTINCT s.S1 as FROM public.TABLE1 s, public.TABLE2 c, public.TABLE4 p
 WHERE new.P1 = p.P1 AND new.Z1 = c.Z1 AND c.S1= s.S1)
ID_D_CURRENT:=(SELECT d.iD_D FROM public.TABLE0 d, public.TABLE4 p 
 WHERE d.ID_D = p.ID_D AND new.P1 = p.P1)
 UPDATE public.TABLE0 e SET e.S1 = S1b WHERE e.ID_D = ID_D_CURRENT
  end if;
END;
Pensez vous que je suis dans le bon sens ou pas du tout ?