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 :

trigger et table mutante


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut trigger et table mutante
    Bonjour,
    J'ai un souci de table mutante dans mon trigger.
    J'ai compris dans d'autres discussions que c'était dû au fait que je faisais appel à ma table depuis laquelle mon trigger était lancé or je ne vois pas comment faire autrement.
    Explication :
    J'ai la table A qui contient une année et un montant
    table A
    Annee montant
    2010 10
    2009 15
    2008 24

    selon l'année et le montant je vais remplir une table B avec une tranche pour l'année surlaquelle je travaille et sur l'année N-1
    table B
    Annee trancheAnneeN trancheAnneeN-1
    2010 1 1
    2009 1 2
    2008 1 0


    Dans mon trigger je vais donc chercher la valeur de l'année précédente pour pouvoir remplir ma TrancheAnneeN-1

    Cela est-il faisable?

    Cordialement
    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Un petit bout de code pour illustrer et ce sera parfait !

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Bonjour,

    Plusieurs solutions pour la table mutante : ORA-04091

    1) Ne pas utiliser de trigger, mais une procedure PL/SQL
    2) mettre le trigger sur l'evenement AFTER pour passer après la transaction en conflit
    3) utiliser autonomous transactions

    et d'autres surement ...

    EDIT : Appeler le professeur Xavier

  4. #4
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    Désolé, le voici.
    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
    27
    28
    29
    CREATE OR REPLACE TRIGGER "TRG_ANNEE_I" BEFORE
    UPDATE
    OF "ANNEE_I", "MNT", "ag" ON "AG_ANNEE_I" FOR EACH ROW 
    DECLARE 
         nT1  		ag_ex_t.NUM_T%type;
         nT2  		ag_ex_t.NUM_T%type;
         Im  		ag_annee_i.Ip%type;
    BEGIN
    --
    	Select mnt into Im
    	From Ag_annee_i
    	Where Annee_i=(:NEW.ANNEE_I - 1)
    		And ag=:NEW.AG
    		And rownum=1;
    	SELECT num_t INTO nT2
    	FROM tr_i
    	WHERE Im between MNT1 and MNT2
    		AND ex = (:NEW.ANNEE_I + 1)
    		and rownum=1;
    	SELECT num_t INTO nT2
    	FROM tr_i
    	WHERE Im between MNT1 and MNT2
    		AND ex = (:NEW.ANNEE_I + 2)
    		and rownum=1;
        update ag_ex_t
        set num_t=nT1,num_t2=nT2
        where ex=:new.annee_i+2
    	and agent=:new.ag;
    end;

  5. #5
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    En posant le problème et en lisant vos réponses, j'ai trouvé la solution.
    Pour cela j'ai remplacé tout bêtement
    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
    	SELECT mnt INTO Im
    	FROM Ag_annee_i
    	WHERE Annee_i=(:NEW.ANNEE_I - 1)
    		AND ag=:NEW.AG
    		AND rownum=1;
    	SELECT num_t INTO nT2
    	FROM tr_i
    	WHERE Im BETWEEN MNT1 AND MNT2
    		AND ex = (:NEW.ANNEE_I + 1)
    		AND rownum=1;
    	SELECT num_t INTO nT2
    	FROM tr_i
    	WHERE Im BETWEEN MNT1 AND MNT2
    		AND ex = (:NEW.ANNEE_I + 2)
    		AND rownum=1;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT num_t INTO nT2
    	FROM ag_ex_t
    	WHERE ex = (:NEW.ANNEE_I+1);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [11g] Trigger et table mutante
    Par lenoil dans le forum PL/SQL
    Réponses: 4
    Dernier message: 14/09/2012, 12h31
  2. Réponses: 4
    Dernier message: 25/06/2009, 17h01
  3. [10gXE][PL/SQL] trigger + table mutante
    Par <% Bastien %> dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/04/2007, 14h49
  4. Probleme trigger-tables mutantes
    Par scariou29 dans le forum Administration
    Réponses: 2
    Dernier message: 17/11/2006, 17h13
  5. [pl/sql] Trigger et table mutante
    Par claralavraie dans le forum Oracle
    Réponses: 20
    Dernier message: 18/07/2006, 15h41

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