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
Partager