Bonjour,

j'ai un problème de table mutante. Je suis donc allé lire le post de POMALAIX Résolution du problème de la table mutante (ora-04091). C'est d'ailleurs à ce propos que je pose ma question.

La dernière partie indique qu'on peut gérer l'erreur en déclarant une EXCEPTION que l'on catche à bon escient.
Ci dessous le code :

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

CREATE OR REPLACE TRIGGER TRIG_INSCRIPTION BEFORE INSERT ON INSCRIPTION FOR EACH ROW
DECLARE
    NB_RESERVE INTEGER ; -- nombre de réservations déjà faites
    NB_MAXPLACE INTEGER ; -- nombre de places total
    TABLE_MUTANTE EXCEPTION;
    PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
BEGIN
    SELECT COUNT (*) INTO NB_RESERVE FROM INSCRIPTION
    WHERE IDV=:NEW.IDV;
    SELECT MAXPLACE INTO NB_MAXPLACE FROM VOYAGE
    WHERE IDV=:NEW.IDV;
    IF NB_MAXPLACE - NB_RESERVE < 0 THEN
        DBMS_OUTPUT.PUT_LINE('Désolé, voyage complet');
    END IF ;
    EXCEPTION
        WHEN TABLE_MUTANTE THEN
        DBMS_OUTPUT.PUT_LINE('Fausse alerte');
   
END ;

Je ne comprends en fait pas vraiment comment un tel code peut marcher.

J'ai testé le cas identique à l'exemple et ça marche. J'ai donc voulu l'adapter à ma problématique et là ça ne marche pas ...

En fait pour reprendre l'exemple, voilà comment je comprends le code.
Si le trigger sur la table INSCRIPTION doit exécuter la requete SELECT COUNT (*) FROM INSCRIPTION, je pense que ça doit générer l'erreur "ORA-04091 table mutante".
Or dans ce cas on catche via notre gestion d'erreur mais l'exécution ayant planté, la variable NB_RESERVE n'est pas affectée ...
Donc pour moi ce code devrait permettre de ne pas afficher le message d'erreur de la table mutante mais ne devrait pas permettre de réaliser correctement l'exécution du trigger.

Je fais donc appel à vous pour m'expliquer où mon raisonnement est faux ...

Merci