IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Table mutante : besoin de détails supplémentaires


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut Table mutante : besoin de détails supplémentaires
    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

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Dans ton cas il n'y a pas de fausse alerte, ta table est en mutation .

    je te propose de créer une fonction PRAGMA AUTONOMOUS_TRANSACTION qui te retourne le NB_RESERVE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create or replace function  f_nb_reserve( id number) return number 
    as 
    PRAGMA AUTONOMOUS_TRANSACTION;
    NB_RESERVE number;
    begin 
     
    SELECT COUNT (*) INTO NB_RESERVE FROM INSCRIPTION
        WHERE IDV=id;
    return NB_RESERVE ;
    end ;
    Ton trigger tu le crées comme suit :
    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
     NB_RESERVE :=F_NB_RESERVE(:NEW.IDV);
       -- 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 ;

Discussions similaires

  1. ApplyUpdates avec 02 tables en maître et détail
    Par aallal dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 02/07/2006, 18h04
  2. Table Mutante
    Par chiheb dans le forum Oracle
    Réponses: 5
    Dernier message: 24/04/2006, 16h22
  3. Réponses: 4
    Dernier message: 30/10/2005, 09h13
  4. [Table liée] Besoin d'une clé
    Par Odulo dans le forum Access
    Réponses: 4
    Dernier message: 22/09/2005, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo