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 :

[10gXE][PL/SQL] trigger + table mutante


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Points : 42
    Points
    42
    Par défaut [10gXE][PL/SQL] trigger + table mutante
    Voila en ce moment je suis en train de tester les tables objet relationnel et pour assurer l'intégrité référentiel j'ai du créer un trigger (before insert) qui vérifie donc quan j'insert une nouvelle ligne si une référence n'est pas déja contenu dans la table ou pointe cette référence.

    Voila la table concerné par le trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create table operation
    (num_op char(5) primary key NOT  NULL,
    salleop char(15),
    dateop date,
    description char(30),
    refpat REF t_patient scope is ob_patient,
    listeactes t_liste_actes)
    nested table listeactes store as acte_tab;
    et voila le trigger en question :

    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
    create or replace trigger trig_patient
      before insert on operation
      for each row
    declare
    nbr number;
    table_mutante exception;
    pragma exception_init(table_mutante, -4091);
    begin
      select count(*) into nbr
        from operation
        where refpat = :NEW.refpat;
      if not (nbr = 0) then
        Raise_application_error(-20101,'Pb unicité : doublon');
      end if;
      exception when table_mutante then 
      dbms_output.put_line('Fausse alerte');
    end;
    j'ai dû capturer l'erreur "-4091 table mutante" parce que quand j'essayais d'insert une nouvelle ligne il m'affichait cette erreur.

    Mais a présent le trigger ne m'affiche plus l'erreur. Il ne fait rien, même quand je met la même référence il ajoute la ligne.

    Voila si vous pouviez me dire comment résoudre mon probleme je vous serais trés reconnaissant^^.

    ps : mon insert de test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into operation 
    select '1','salle 1','17/06/07','Transplantation', ref(p), t_liste_actes(t_acte('A01', 'radio thorax', 1234.56, ref(m))) 
    from ob_patient p, ob_medecin m 
    where num_p = '1' and num_m = '1';
    Bien evidemment il y a déja une ligne dans la table avec le meme patient en référence.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    http://sgbd.developpez.com/oracle/ora-04091/

    Merci d'indiquer votre version d'Oracle et je vous rappelle qu'il existe un forum sur Oracle dans lequel votre message aurait sa place...
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  3. #3
    Membre du Club
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Points : 42
    Points
    42
    Par défaut
    Bonjour, oui j'ai chercher le bon forum mais je n'avais pas vu qu'il y en avait un pour oracle.

    Pour ce qui est du lien que tu propose je suis déja aller voir la bas c'est justement avec ce tuto que j'ai adopté la technique pour ignorer l'erreur. Malheuresement comme je l'ai dis apres cette modif le trigger ne fonctionne plus correctement..

    Voila si mon post ne correspond pas a cette parti du forum vous pouvez le déplacer dans la partie approprié.

    Edit : Ah j'oubliais j'ai la version 10g de Oracle (Express Edition)

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu seras toujours en table_mutante : Tu ne peux pas lire la table sur laquelle le trigger fait référence.

    Un moyen de contournement : Créer une fonction autonome (PRAGMA AUTONOMOUS_TRANSACTION) qui va faire ton count(*)

    Mais dans ce cas si tu insères 2 fois la même ligne sans commiter, la procédure ne les verra pas.

    Solution simple : créer un index unique sur refpat.
    Oracle le gère tout seul
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre du Club
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Points : 42
    Points
    42
    Par défaut
    ah ok merci j'ai utiliser un index et maintenant ca fonctionne. J'ai voulus faire un trigger parce que notre professeur dans son poilycopié disait qu'on était obliger de créer un trigger, mais j'imagine que c'est uniquement valable pour les tables objet.

  6. #6
    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,

    Un peu petit conseil : ne fais jamais le travail d'Oracle parce qu'il le fait mieux que nous, et si on essaie de le faire on aura que des problèmes.

Discussions similaires

  1. Problème avec un trigger : table mutante
    Par Raiden1234 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 18/12/2008, 14h14
  2. Problème trigger : table mutante
    Par coboy dans le forum PL/SQL
    Réponses: 0
    Dernier message: 12/12/2008, 11h08
  3. [Trigger/table mutante] before ou after INSERT?
    Par rvfranck dans le forum PL/SQL
    Réponses: 0
    Dernier message: 16/10/2008, 19h05
  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