Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2011, 15h34   #1
Membre du Club
 
Inscription : octobre 2009
Messages : 62
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 62
Points : 57
Points : 57
Par défaut La mystérieuse table mutante

Bonjour à tous,

J'avais à l'origine le trigger suivant :

Code :
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 :
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...
marsup077 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h39   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
http://sgbd.developpez.com/oracle/ora-04091/
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h48   #3
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Tu ne fais pas de "commit", ta transaction est-elle validée lorsque tu vérifies ta valeur ?
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h31   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Si ton trigger doit mettre à jour la ligne actuellement modifiée :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE TRIGGER schem0.JF_DEM_SXB
BEFORE 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
      SELECT nr_quartier_elu INTO :new.a.nr_quartier_elu
      FROM jf_grp_lot
      WHERE  nr_grp_lot = :new.nr_grp_lot;
    END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN NULL; 
WHEN  TOO_MANY_ROWS THEN NULL;
END;
/
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/01/2011, 16h45   #5
Membre du Club
 
Inscription : octobre 2009
Messages : 62
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 62
Points : 57
Points : 57
Ouah, ça marche !
T'es trop fort !

Merci beaucoup !
marsup077 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 23h43   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Citation:
Envoyé par marsup077 Voir le message
T'es trop fort !
Oui, je sais, je sais
Plus sérieusement, c'est comme ça que ça s'utilise les triggers.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h52.


 
 
 
 
Partenaires

Hébergement Web