Bonjour à tous,

J'avais à l'origine le trigger suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE OR REPLACE TRIGGER schem0.JF_DEM_SXB
after insert
ON schem0.JF_DEMANDE FOR each row
BEGIN
    IF :NEW.nr_quartier_elu is null and :NEW.nr_commune = '482' and :NEW.nr_grp_lot is not null
    THEN
       update jf_demande a set a.nr_quartier_elu = (select b.nr_quartier_elu from jf_grp_lot b
                                             where  a.nr_grp_lot = b.nr_grp_lot )
    where a.nr_demande = :NEW.nr_demande;                                                         
    END IF;
 
END;
/
... pour mettre à jour le champ nr_quartier_elu d'une table lors de l'insertion d'une ligne.

Or je me retrouve avec le message suivant :

ORA-04091 : la table schem0.JF_DEMANDE est en mutation; le déclencheur ou la fonction ne peut la voir

De fait, ça se produit quand on fait ce genre de choses sur une table comportant des clés étrangères.

En farfouillant pas mal, j'ai trouvé une méthode conseillant de passer par une table temporaire intermédiaire et 2 triggers, alors j'ai écrit ça :

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
 
CREATE GLOBAL TEMPORARY TABLE TEMP_JF_DEMANDE AS SELECT * FROM JF_DEMANDE WHERE 0=1;
 
CREATE OR REPLACE TRIGGER TEMP_JF_DEM_SXB BEFORE INSERT ON JF_DEMANDE FOR EACH ROW
BEGIN
    INSERT INTO TEMP_JF_DEMANDE(NR_DEMANDE, NR_PRECEDENT, NR_PERSONNE, NR_GESTIONNAIRE, NR_MAIRIE, ABSENCE_REPONSE, DATE_DEMANDE, CONVOCATION, PREMIER_REFUS, SECOND_REFUS, 
        TEXTE_LIBRE_DEMANDE, RENOUVELLEMENT, DATE_MAJ, MATRICULE, DATE_DE_REMISE, TYJARDIN, NR_GRP_LOT, NR_COMMUNE, NR_QUARTIER_ELU) 
    VALUES (:NEW.NR_DEMANDE, :NEW.NR_PRECEDENT, :NEW.NR_PERSONNE, :NEW.NR_GESTIONNAIRE, :NEW.NR_MAIRIE, :NEW.ABSENCE_REPONSE, :NEW.DATE_DEMANDE, :NEW.CONVOCATION, :NEW.PREMIER_REFUS, :NEW.SECOND_REFUS, 
        :NEW.TEXTE_LIBRE_DEMANDE, :NEW.RENOUVELLEMENT, :NEW.DATE_MAJ, :NEW.MATRICULE, :NEW.DATE_DE_REMISE, :NEW.TYJARDIN, :NEW.NR_GRP_LOT, :NEW.NR_COMMUNE, :NEW.NR_QUARTIER_ELU);
END ;
/
 
CREATE OR REPLACE TRIGGER JF_DEM_SXB_NEW AFTER INSERT ON TEMP_JF_DEMANDE
BEGIN
    FOR LIGNE IN (SELECT * FROM TEMP_JF_DEMANDE ORDER BY NR_DEMANDE) LOOP
 
    IF LIGNE.nr_quartier_elu is null and LIGNE.nr_commune = '482' and LIGNE.nr_grp_lot is not null    
    THEN      
       execute immediate 'update jf_demande a set a.nr_quartier_elu = (select b.nr_quartier_elu from jf_grp_lot b where  a.nr_grp_lot = b.nr_grp_lot ) where a.nr_demande= ' || LIGNE.nr_demande ;               
        DBMS_OUTPUT.PUT_LINE('update jf_demande a set a.nr_quartier_elu = (select b.nr_quartier_elu from jf_grp_lot b where  a.nr_grp_lot = b.nr_grp_lot) where a.nr_demande= ' || LIGNE.nr_demande);                                                         
    END IF;
 
    END LOOP;            
   DELETE FROM TEMP_JF_DEMANDE;    
END ;
/

Et alors ça ne plante pas, ça semble bien se dérouler, mais mais mon champ nr_quartier_elu n'est pas du tout mis à jour (en clair, l'update ne fait rien).
Bizarre car le DBMS_OUTPUT.PUT_LINE que je fais juste en dessous me donne la requête que je m'attends à voir... et qui fait ce qu'il faut quand je la passe à la main.

Au secours, je comprends plus...