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 :

erreur ora-04091:table mutante


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 279
    Points : 80
    Points
    80
    Par défaut erreur ora-04091:table mutante
    Bonjour,
    j'ai cree un declencheur AFTER INSERT ON TAB1, dans la base de donnees Oracle 10g
    qui verifie l'existence d'une ligne dans la table TAB1 qui a pour type=2
    donc je fais
    [Select count(*) into nb
    from TAB1
    where type=2]
    En cas d'existence j'insere une ligne dans TAB2.
    Lors de l'execution il m'affiche l'erreur ora-04091:table mutante.
    Comment faire pour résoudre ce probleme
    Merci

  2. #2
    Membre actif

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2008
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 109
    Points : 204
    Points
    204
    Par défaut
    Bonjour
    je vous invite a lire cet article sur la table mutante
    http://sgbd.developpez.com/oracle/ora-04091/

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 279
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par umarus Voir le message
    Bonjour
    je vous invite a lire cet article sur la table mutante
    http://sgbd.developpez.com/oracle/ora-04091/
    merci mais j'ai lu cet article sans savoir comment l'appliquer pour resoudre mon probleme.est ce que tu peux m'aider

  4. #4
    Membre actif

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2008
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 109
    Points : 204
    Points
    204
    Par défaut
    poste stp tout le trigger

  5. #5
    Membre actif

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2008
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 109
    Points : 204
    Points
    204
    Par défaut
    tu peux marquer le bloc select comme autonome avec la commande suivante apres DECLARE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pragma autonomous_transaction;
    La commande pragma indique au compilateur PL/SQL de marquer la procédure, la fonction ou le bloc PL/SQL comme transactionnellement autonome.

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 279
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par umarus Voir le message
    poste stp tout le trigger
    declare
    nb number; nbeq number;
    Begin
    if :new.CODEEQUIPE = (990002) then
    select count(*) into nb
    from LESSERVNAVIRES
    where codeshift = :new.codeshift and CODEEQUIPE =990001;
    if nb <> 0 then
    insert into heuresupon (codeshift,operation,nombre,codeserv,prix)
    values (:new.codeshift,:new.codeopt,:new.nombre,:new.CODESERVICENAV,'0000');
    end if;
    end if;
    end;

  7. #7
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Attention, le web fourmille de mauvais conseils !!
    Un déclencheur en transaction autonome ne permet pas de résoudre l'erreur ORA-04091.
    Certes, elle disparaît, mais l'effet secondaire est sévère comme on va le voir.

    Car dans ce cas, le déclencheur se déroulant dans une transaction indépendante, il est soumis aux règles ordinaires d'isolation des transactions.
    En mode READ COMMITTED qui est l'option par défaut, le déclencheur ne peut voir les modifications effectuées par la transaction "principale" qu'une fois qu'elles auront été validées par un COMMIT.
    Or le principe même du déclencheur (autonome ou non) est de s'exécuter avant le COMMIT.
    Conclusion, le déclencheur autonome ne verra jamais les modifications effectuées par la transaction principale !

    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
     
    set serveroutput on
     
    drop table t1;
    create table t1(a int);
     
    create or replace trigger trigauto
    before insert on t1
    for each row
    declare
    	pragma autonomous_transaction;
    	nb	int;
    begin
    	select count(*) into nb from t1;
    	dbms_output.put_line('nb de lignes dans t1 : ' || nb);
    	dbms_output.put_line('numéro de ligne insérée : ' || :new.a);
    end;
    /
     
     
    insert into t1
    select rownum from dba_objects where rownum <6;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    nb de lignes dans t1 : 0
    numéro de ligne insérée : 1
    nb de lignes dans t1 : 0
    numéro de ligne insérée : 2
    nb de lignes dans t1 : 0
    numéro de ligne insérée : 3
    nb de lignes dans t1 : 0
    numéro de ligne insérée : 4
    nb de lignes dans t1 : 0
    numéro de ligne insérée : 5
    Pour le déclencheur autonome, la table est vide !
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  8. #8
    Membre actif

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2008
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 109
    Points : 204
    Points
    204
    Par défaut
    méaculpa

    cependant je vous invite a nous proposez une solution Pomalaix

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/06/2011, 09h43
  2. Réponses: 4
    Dernier message: 14/04/2011, 12h12
  3. Erreur : ORA-00942: table or view does not exist
    Par Lolitaaa dans le forum SQL
    Réponses: 2
    Dernier message: 26/07/2010, 19h01
  4. Réponses: 4
    Dernier message: 21/03/2009, 00h35
  5. Réponses: 4
    Dernier message: 30/10/2005, 09h13

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