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

Oracle Discussion :

[Oacle9i][Triggers] Mutating


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut [Oacle9i][Triggers] Mutating
    Bonjour,

    Je suis en pre-insert d'un trigger de table oracle.
    Je voudrais pouvoir executer un query sur d'autres enregistrements de cette même table mais je me retrouve locké.

    J'ai essayé de le réaliser par un cursor FOR UPDATE mais cela ne marche pas.

    Mercipour votre aide

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut


    Tu peux utiliser une transaction autonome (autonomous_transaction) ou bien lire cet article : http://sgbd.developpez.com/oracle/ora-04091/

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    J'avais bien regardé ce tutorial mais d'après ce que j'ai compris cela ne m'aide pas dans mon cas.
    Je ne peux pas changer la structure de la base (table ou vue)
    J'aurais pensé qu'il existait une façon de faire pour interroger d'autres records de la table excepté celui sur lequel on est en cours (on bloque le record et non la table) mais pour le moment je n'ai rien trouvé ...

    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    que je suis bête ...
    En fait je pensais que gérer l'exception ne permettais pas de me ramener le bon count(*) sur la table ...
    je pensais que la valeur serait toujours de 0

    Merci

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    de rien

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    j'ai parlé un peu vite

    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
     
    DECLARE
      nCount NUMBER;
      TABLE_MUTANTE EXCEPTION;
      PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
    BEGIN
      BEGIN
           SELECT count(*) 
           INTO nCount
           FROM R5PROPERTYVALUES
           WHERE prv_property IN ('POSE', 'DEPOSE')
           AND prv_code = :new.prv_code;
      EXCEPTION WHEN TABLE_MUTANTE THEN 
                null;
      END;
     
      IF NVL(nCount,0) = 2 THEN
         RAISE_APPLICATION_ERROR (123,'toto');
      END IF;
    Le count(*) ne me ramène jamais la bonne valeur ...
    Il y a un truc qui m'échappe.

    Merci

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Dans ce cas, voila ce que je te propose en utilisant les transactions autonomes :

    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
    CREATE OR REPLACE FUNCTION r5propertyvalues_exist(p_prv_code VARCHAR2)
    RETURN NUMBER IS
    nCount NUMBER;
    PRAGMA autonomous_transaction;
    BEGIN
     
           SELECT count(*)
           INTO nCount
           FROM R5PROPERTYVALUES
           WHERE prv_property IN ('POSE', 'DEPOSE')
           AND prv_code = p_prv_code; 
     
    RETURN nCount;
     
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR REPLACE TRIGGER...
    nCount NUMBER;
    BEGIN
        nCount  := r5propertyvalues_exist(:new.prv_code);
     
      IF nCount = 2 THEN
         RAISE_APPLICATION_ERROR (123,'toto');
      END IF; 
     
    END;
    /

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    Je n'ai pas trop compris ce que c'est que les transactions autonomes mais je vais me renseigner.
    En tout cas je vais tester ca je te remercie beaucoup pour ton aide

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    une transaction autonome permet de lancer une transaction en paralléle de la transaction en cours. Ca permet en particulier de contourner cette problèmatique

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Par défaut
    Fantastique, c'est exactement ce qu'il me faut.

    Merci pour tout

+ 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. [Oracle8i][Trigger]Table en mutation
    Par Drizzt [Drone38] dans le forum Administration
    Réponses: 6
    Dernier message: 06/11/2009, 13h58
  3. pb de mutation sur trigger
    Par karenv5 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/11/2009, 17h51
  4. problème de mutation causé par un trigger
    Par scofild20 dans le forum SQL
    Réponses: 5
    Dernier message: 29/04/2009, 16h41

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