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 :

Trigger comparer deux colonnes [10g]


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 93
    Points : 43
    Points
    43
    Par défaut Trigger comparer deux colonnes
    Salut,

    le candidat va repondre à plusieur question de type qcm, chaque reponse sera enregister dans la table niveau
    je veux crée un trigger qui comparer pour chaque ligne inseré les 2 colonne REPONSE_CANDIDAT et REPONSE_CORRECT de la table NIVEAU
    si les 2 colonne est égale, va enregistre le nombre de question correcte et le candidat qui repondre à ces question et le statut
    le fonction qui je crée retourn 1 si les 2 colonne égale

    le probleme que je ne sais pas où le problème, car le trigger ne fonctionne pas :/

    table candidat
    Nom : 1.png
Affichages : 396
Taille : 7,1 Ko

    table niveau
    Nom : 1.png
Affichages : 400
Taille : 7,5 Ko

    table question_choisir
    Nom : 1.png
Affichages : 386
Taille : 5,0 Ko

    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
     
    CREATE OR REPLACE TRIGGER tmp_niveau_ai AFTER INSERT ON NIVEAU FOR EACH ROW
    declare
    l_nbr number;
    l_exist number;
    BEGIN
     
    --retourne nombre de question de test qui passer par le candidat courant
    select count(*) into l_nbr from NIVEAU n,CANDIDAT c, QUESTION_CHOISIT qc where n.FK_CANDIDAT=c.ID_CANDIDAT and c.FK_TEST=qc.FK_TEST and n.FK_CANDIDAT = :new.FK_CANDIDAT;
     
    --nombre nombre de candidat existe dans tableau resultat (normalement retourn 0 ou 1) 
    select count(*) into l_exist from RESULTAT t where t.FK_CANDIDAT = :new.FK_CANDIDAT;
     
       if l_exist = 0 then --si le candidat n'existe pas
          insert into RESULTAT (ID_RESULTAT , NBR_REPONSE_CORRECTE ,STATUT , FK_CANDIDAT) values
          (:new.FK_CANDIDAT,NULL,NULL,:new.FK_CANDIDAT);
       else    -- si le candidat existe
         update RESULTAT t set 
         t.NBR_REPONSE_CORRECTE  = t.NBR_REPONSE_CORRECTE +  get_nbr_question(:new.FK_CANDIDAT , :new.FK_QUESTION_CHOISIT),     -- metre à jour nombre reponse correcte
         t.STATUT                = case when (t.NBR_REPONSE_CORRECTE > l_nbr) then 'accept' else 'refusé' end  --metre à jour le statut
         where t.FK_CANDIDAT = FK_CANDIDAT;
     
            END IF;
    END;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE FUNCTION get_nbr_question (idC NUMBER, idQC NUMBER) RETURN NUMBER 
    IS 
    nbr NUMBER := 0;
    rcr VARCHAR2(255);
    rc VARCHAR2(255);
    BEGIN
    select REPONSE_CANDIDAT into rc from NIVEAU n where n.FK_CANDIDAT = idC and n.FK_QUESTION_CHOISIT = idQC;
    select REPONSE_CORRECT into rcr from NIVEAU n where n.FK_CANDIDAT = idC and n.FK_QUESTION_CHOISIT  = idQC;
    IF rc = rcr THEN -- si REPONSE_CANDIDAT egale REPONSE_CORRECT, nbr =1 si non egale 0
    nbr:=1;
    END IF;
    RETURN nbr;
    END;

  2. #2
    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 ne peux pas faire un SELECT sur la table du trigger dans un FOR EACH ROW, tu dois avoir l'erreur Table mutante (mutating table).
    Si les données à utilisée sont dans le record inséré, alors il faut utiliser les variable :new.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre confirmé
    Homme Profil pro
    xxxxxxxxx
    Inscrit en
    Avril 2015
    Messages
    392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : xxxxxxxxx

    Informations forums :
    Inscription : Avril 2015
    Messages : 392
    Points : 552
    Points
    552
    Par défaut Triggers
    Comme il t'a dit ton collègue, le trigger "tmp_niveau_ai" (AFTER INSERT ON NIVEAU for each row)
    ne peut pas utiliser une table en cours de lecture en même temps, cependent
    -si tu es en version 11gR1 au minimum, tu peux utiliser les triggers composé qui eux ont
    résolu ce type de problème ! sinon la logique du code est normalement correcte

  4. #4
    Membre confirmé
    Homme Profil pro
    xxxxxxxxx
    Inscrit en
    Avril 2015
    Messages
    392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : xxxxxxxxx

    Informations forums :
    Inscription : Avril 2015
    Messages : 392
    Points : 552
    Points
    552
    Par défaut PB trigger liés aux tables
    Tu peux réssayer le code suivant en joutant une ligne (*)
    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
     
    CREATE OR REPLACE TRIGGER tmp_niveau_ai AFTER INSERT ON NIVEAU FOR EACH ROW
    declare
    l_nbr number;
    l_exist number;
    pragma autonomous_transaction; (*) <-- cette ligne pourra peut-être t'aidé 
    BEGIN
     
    --retourne nombre de question de test qui passer par le candidat courant
    select count(*) into l_nbr from NIVEAU n,CANDIDAT c, QUESTION_CHOISIT qc where n.FK_CANDIDAT=c.ID_CANDIDAT and c.FK_TEST=qc.FK_TEST and n.FK_CANDIDAT = :new.FK_CANDIDAT;
     
    --nombre nombre de candidat existe dans tableau resultat (normalement retourn 0 ou 1) 
    select count(*) into l_exist from RESULTAT t where t.FK_CANDIDAT = :new.FK_CANDIDAT;
     
       if l_exist = 0 then --si le candidat n'existe pas
          insert into RESULTAT (ID_RESULTAT , NBR_REPONSE_CORRECTE ,STATUT , FK_CANDIDAT) values
          (:new.FK_CANDIDAT,NULL,NULL,:new.FK_CANDIDAT);
       else    -- si le candidat existe
         update RESULTAT t set 
         t.NBR_REPONSE_CORRECTE  = t.NBR_REPONSE_CORRECTE +  get_nbr_question(:new.FK_CANDIDAT , :new.FK_QUESTION_CHOISIT),     -- metre à jour nombre reponse correcte
         t.STATUT                = case when (t.NBR_REPONSE_CORRECTE > l_nbr) then 'accept' else 'refusé' end  --metre à jour le statut
         where t.FK_CANDIDAT = FK_CANDIDAT;
     
            END IF;
    END;
    bonne chance !

  5. #5
    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
    Citation Envoyé par dell68 Voir le message
    Tu peux réssayer le code suivant en joutant une ligne (*)
    ...
    C'est mieux de ne pas la faire: The mutating table error prevents non-deterministic behavior of your code

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

Discussions similaires

  1. comparer deux colonnes
    Par dumor dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/10/2008, 23h00
  2. Comparer deux colonnes
    Par gandalfthegrey dans le forum Excel
    Réponses: 6
    Dernier message: 30/01/2008, 11h57
  3. Comparer deux colonnes d'une même table
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 08/01/2008, 10h05
  4. Comparer deux colonnes adjacentes une à une sur mon tableau?
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/12/2007, 10h11
  5. comparer deux colonnes sur Excel
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/12/2005, 10h50

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