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 dans la création d'un trigger


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Erreur dans la création d'un trigger
    * Bonjour, *

    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
    30
    31
    Create or Replace trigger triggerSubSetDirecteurLab
    after insert or update on Laboratoire
    FOR EACH ROW 
    DECLARE 
     trouve INTEGER := 0;
     PRAGMA AUTONOMOUS_TRANSACTION;
     invalideRefDirecteur Exception;
    BEGIN
     
        if inserting then 
     
            for refMembreV in (select m.refMembre from laboratoire l, TABLE(l.LesMembres) m where l.idLab = :new.idLab) loop
                if (:new.RefDirecteur = refMembreV) then
                    trouve := 1;
                end if;
     
            end loop;
        end if;
     
     
        if trouve = 0 then RAISE invalideRefDirecteur;
        end if;
     
        COMMIT;
     
        EXCEPTION
        WHEN invalideRefDirecteur THEN 
        ROLLBACK;
        raise_application_error( -20006, 'Violation de la contrainte {subset} le membre directeur doit être un membre du laboratoire' );
     
    END;
    celui-ci me donne ces erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Erreurs pour TRIGGER TRIGGERSUBSETDIRECTEURLAB :
    LINE/COL     ERROR
    10/4     PL/SQL: Statement ignored
    10/14     PLS-00382: expression du mauvais type
    C'est quoi l'erreur exactement ???!!

    * Merci *

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pas de commit ou rollback dans un trigger; refMembreV est une type de données Record avec un seul champ refMembre qui ne peut pas être comparé directement avec :new.refDirecteur.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup, vous pouvez m'indiquer s'il vous plait comment procéder pour résoudre ce problème

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Décrivez votre besoin et fournissez le DDL de vos tables, vous semblez avoir besoin d'une clé étrangère...

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    La creation du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace type Laboratoire_t as Object( -- vérifié
    idLab int , 
    nom varchar(30),
    adresse varchar(60),
    RefDirecteur  REF membre_t,
    LesMembres LesRefMembre_t,
     
    );

    voilà la partie du trigger :

    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
    Create or Replace trigger triggerLaboratoire
    AFTER insert or update or delete on Laboratoire
    For each row 
    DECLARE 
     trouve INTEGER := 0;
     PRAGMA AUTONOMOUS_TRANSACTION;
     invalideRefDirecteur Exception;
     idMembre INTEGER;
    BEGIN
     
     
    	if inserting or updating then 
     
    		select m.idMembre into idMembre from membre m where ref(m) = :new.RefDirecteur;
    		SELECT count(m.refMembre.idMembre) into trouve FROM laboratoire l, TABLE(l.LesMembres) m WHERE l.idLab = :new.idLab and m.refMembre.idMembre = idMembre;
     
    		DBMS_OUTPUT.put_line(idMembre);
    		DBMS_OUTPUT.put_line(trouve);
    	  if trouve = 0 then
    		RAISE invalideRefDirecteur;
    	  end if;
     
    	end if;
     
    	EXCEPTION
    	WHEN invalideRefDirecteur THEN 
    	raise_application_error( -20006, 'Violation de la contrainte {subset} le membre directeur doit être un membre du laboratoire' );
    END;
    ce trigger va essayer de voir si le le refdirecteur appartient tout d'abord aux membres du laboratoire avant d'être un directeur du laboratoire;

    c'est une alternative à la première solution, mais de même ça marche pas car j'ai isolé la transaction(PRAGMA AUTONOMOUS_TRANSACTION d'insertion du laboratoire de l’exécution du trigger(je suis obligé car je tombe dans l'erreur de la mutation de la table).

    De même j'en ai une erreur, le trigger ne prend pas en considération l'insertion de laboratoire ce qui veut dire qu'il retourne 0.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    1er conseil, n'utilisez pas les NESTED TABLE pour stocker vos données, utilisez des tables normales.

    Ensuite vous ne pouvez pas faire cette validation dans un trigger.
    Et c'est une grave erreur que de vouloir contourner la mutation de table (erreur qui vous indique que vous êtes en train de développer du code sans tenir compte de la concurrence d'accès) en utilisant une transaction autonome qui sert dans 99,9999% des cas à alimenter une table de log.

    Si vous ne pouvez pas changer votre modèle objet, regardez peut être REF Constraint Examples pour essayer de créer votre contrainte d'intégrité, au cas où.

    Si vous avez toujours des problèmes, merci de fournir l'intégralité des DDL (qui compilent) nécessaires pour la reproduction des erreurs.

Discussions similaires

  1. Erreur dans ma création de base
    Par Ellia dans le forum Débutez
    Réponses: 2
    Dernier message: 10/07/2012, 15h23
  2. erreur dans la création d'un paquet DEBIAN
    Par LM_programme dans le forum Debian
    Réponses: 1
    Dernier message: 19/07/2011, 20h19
  3. Erreur dans une création de fonction. Possible?
    Par marps dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/03/2010, 12h20
  4. Erreur SQL1424N en création d'un trigger
    Par rapha51 dans le forum DB2
    Réponses: 2
    Dernier message: 04/06/2007, 16h30

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