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

PL/SQL Oracle Discussion :

table is mutating


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut table is mutating
    Bonjour,
    Je fais un trigger sous oracle 10g. Je veux modifier un champ d'une table lorsque qu'un autre champ de cette table est modifiée. J'ai déjà lu que c'était possible sur le principe. Voici mon trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> create or replace trigger trigger_radio_navaid_kind
      2  before update of radio_navaid_kind on geo_pt
      3  for each row when (old.radio_navaid_kind is null)
      4  begin
      5     if :new.radio_navaid_kind = 'VOR'
      6     then
      7             update geo_pt set aixm_equip1_identifier = sys_guid();
      8     end if;
      9  end;
     10  /
     
    Trigger created.
    J'ai l'erreur suivante en testant mon trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> update geo_pt set radio_navaid_kind='VOR' where point_name='ABADO';
    update geo_pt set radio_navaid_kind='VOR' where point_name='ABADO'
    *
    ERROR at line 1:
    ORA-04091: table OPS$OPE.GEO_PT is mutating, trigger/function may not see it
    ORA-06512: at "OPS$OPE.TRIGGER_RADIO_NAVAID_KIND", line 4
    ORA-04088: error during execution of trigger
    'OPS$OPE.TRIGGER_RADIO_NAVAID_KIND'
    Ma table geo_pt est définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> desc geo_pt
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     POINT_NAME                                NOT NULL VARCHAR2(5)
     RADIO_NAVAID_KIND                                  VARCHAR2(16)
     AIXM_EQUIP1_IDENTIFIER                             VARCHAR2(36)
     
    SQL>
    Merci de votre aide

  2. #2
    Membre émérite Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Par défaut
    Bonjour,
    tu veux vraiment mettre à jour toute la table ?
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF :new.radio_navaid_kind = 'VOR'
           then
                :new.aixm_equip1_identifier = sys_guid();
           end IF;
    ça marche mais ça ne met à jour que le champ de la ligne concernée.

  3. #3
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> CREATE OR REPLACE TRIGGER trigger_radio_navaid_kind
      2  before UPDATE of radio_navaid_kind ON geo_pt
      3  FOR each row when (old.radio_navaid_kind IS NULL)
      4  begin
      5     IF :new.radio_navaid_kind = 'VOR'
      6     then
      7        :new.aixm_equip1_identifier := sys_guid();
      8     end IF;
      9  end;
     10  /

  4. #4
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    et pourquoi pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER trigger_radio_navaid_kind
      before UPDATE of radio_navaid_kind ON geo_pt
      FOR each row when (old.radio_navaid_kind IS NULL and new.radio_navaid_kind = 'VOR')
    begin
       :new.aixm_equip1_identifier := sys_guid();
    end;
    /

  5. #5
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    Bonjour,
    La dernière proposition semble être la bonne. Le trigger se déclenche bien.
    Merci beaucoup.

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

Discussions similaires

  1. Trigger: table en mutation
    Par JCD21 dans le forum Débuter
    Réponses: 10
    Dernier message: 16/08/2011, 14h19
  2. la table en mutation
    Par cadabricadabra dans le forum Oracle
    Réponses: 1
    Dernier message: 20/09/2010, 15h19
  3. [Oracle8i][Trigger]Table en mutation
    Par Drizzt [Drone38] dans le forum Administration
    Réponses: 6
    Dernier message: 06/11/2009, 13h58
  4. Erreur table en mutation
    Par bruce-willis dans le forum SQL
    Réponses: 1
    Dernier message: 25/03/2008, 09h50
  5. Curseurs et tables en mutation
    Par ze_patoche dans le forum Oracle
    Réponses: 7
    Dernier message: 18/10/2005, 10h58

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