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 compilé sans erreur mais ne fonctionne pas


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Trigger compilé sans erreur mais ne fonctionne pas
    bonjour a tous, j ai un petit probleme de debutant, j ai mes tables et un trigger qui agit sur deux, il est compilé correctement mais apres la fameuse insert rien ne se passe comme modification des tables, brefs voila mes simples tables et declencheur, merci de me donner un coup de pousse


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE Banque
    ( Bid NUMBER(10) PRIMARY KEY,
    Bnom VARCHAR2(50)
    );
    CREATE TABLE Compte
    ( Cid NUMBER PRIMARY KEY,
    Cnumero NUMBER(10,2),
    Clibelle VARCHAR2(100),
    Csolde NUMBER(10,2),
    Cbanque NUMBER(10,2),
    CONSTRAINT FK_Cbanque FOREIGN KEY (Cbanque)REFERENCES "BANQUE" (Bid) Enable
    );



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE Operation
    ( Oidd NUMBER PRIMARY KEY,
    Odate DATE,
    Omontant NUMBER(10,2),
    Osens CHAR,
    Ocompte NUMBER,
    CONSTRAINT FK_Operation FOREIGN KEY (Ocompte) REFERENCES "COMPTE" (Cid) Enable
    ) ;
    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
    create or replace trigger SHOT 
    AFTER INSERT ON Operation 
    referencing new as new old as old
    for each row
    DECLARE
    sens Operation.Osens%type;
    mont Operation.Omontant%type;
    code NUMBER;
      -- making the trigger work outside of the main transaction
      PRAGMA autonomous_transaction;
    Begin
    SELECT Ocompte into code FROM OPERATION WHERE Oidd=:new.oidd;
    SELECT Omontant into mont FROM Operation WHERE Oidd=:new.Oidd;
    SELECT Osens into sens FROM Operation WHERE Oidd=:new.Oidd;
     IF (sens='c') 
     then
        UPDATE COMPTE SET Csolde=Csolde+mont WHERE Cid=code;
     ELSE
        UPDATE COMPTE SET Csolde=Csolde-mont WHERE Cid=code;
     end IF;
    EXCEPTION WHEN NO_DATA_FOUND THEN NULL; 
    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
    Bonjour,

    Je vais regarder, mais en attendant, pour plus de lisibilité, peux-tu encadrer les codse sql des balises CODE (l'icône # dans le menu quand tu édites ton message).

    Merci

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -- making the trigger work outside of the main transaction
    -- Create a HUGE BUG
    PRAGMA autonomous_transaction;
    Fixed

    Supprimer le PRAGMA AUTONOMOUS_TRANSACTION, et utiliser :new et :old sur les colonnes Ocompte, Omontant, Osens directement.

    PS : referencing new as new old as old est inutile.

  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
    Jamais de SELECT sur la table du trigger en FOR EACH ROW
    Pourquoi faire 3 SELECT alors qu'un seul suffirait ? Essaye toujours de limiter les lectures aux tables.
    Tu aurais pu faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Ocompte, Omontant, Osens  into code, mont, sens FROM Operation WHERE Oidd=:new.Oidd;
    Tu as un trigger AFTER INSERT sur la table, donc tu as les données insérées en variables référencées par :new.nom_colonne. Tu l'a bien saisi pour Oidd, pourquoi vouloir refaire un select pour avoir Ocompte, Omontant et Osens ?
    Enfin, pourquoi mettre le trigger en Autonomous_transaction ? Ca me semble inutile dans ce trigger.

    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 SHOT
    AFTER INSERT ON OPERATION
    FOR EACH ROW
    DECLARE
    BEGIN
      IF :NEW.Osens = 'c'
      THEN
      	UPDATE COMPTE SET Csolde = Csolde + :NEW.Omontant WHERE Cid= :NEW.Ocompte;
      ELSE
      	UPDATE COMPTE SET Csolde = Csolde - :NEW.Omontant WHERE Cid= :NEW.Ocompte;
      END IF;
    END;
    Améliorations :
    Attention aux valeurs NULL pour Csolde et Omontant (mettre des NVL)
    Il peut être utile de vérifier que la ligne COMPTE n'est pas lockée avant de faire l'update.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Merci énormément :D :D :D
    Citation Envoyé par McM Voir le message
    Jamais de SELECT sur la table du trigger en FOR EACH ROW
    Pourquoi faire 3 SELECT alors qu'un seul suffirait ? Essaye toujours de limiter les lectures aux tables.
    Tu aurais pu faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Ocompte, Omontant, Osens  into code, mont, sens FROM Operation WHERE Oidd=:new.Oidd;
    Tu as un trigger AFTER INSERT sur la table, donc tu as les données insérées en variables référencées par :new.nom_colonne. Tu l'a bien saisi pour Oidd, pourquoi vouloir refaire un select pour avoir Ocompte, Omontant et Osens ?
    Enfin, pourquoi mettre le trigger en Autonomous_transaction ? Ca me semble inutile dans ce trigger.

    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 SHOT
    AFTER INSERT ON OPERATION
    FOR EACH ROW
    DECLARE
    BEGIN
      IF :NEW.Osens = 'c'
      THEN
      	UPDATE COMPTE SET Csolde = Csolde + :NEW.Omontant WHERE Cid= :NEW.Ocompte;
      ELSE
      	UPDATE COMPTE SET Csolde = Csolde - :NEW.Omontant WHERE Cid= :NEW.Ocompte;
      END IF;
    END;
    Améliorations :
    Attention aux valeurs NULL pour Csolde et Omontant (mettre des NVL)
    Il peut être utile de vérifier que la ligne COMPTE n'est pas lockée avant de faire l'update.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Merci énormément :D :D :D
    Supprimer le PRAGMA AUTONOMOUS_TRANSACTION, et utiliser :new et :old sur les colonnes Ocompte, Omontant, Osens directement.

Discussions similaires

  1. [11g] Autre trigger compilé sans erreur qui ne marche pas
    Par waliddovi dans le forum PL/SQL
    Réponses: 8
    Dernier message: 31/08/2018, 11h47
  2. Réponses: 1
    Dernier message: 14/05/2015, 08h33
  3. [par::packer] compilation sans probleme mais ne fonctionne pas
    Par ours_en_pluche dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2011, 19h53
  4. Pas d'erreur, mais ne fonctionne pas?
    Par ploxien dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/10/2008, 12h54
  5. Mon code sans erreurs mais ne marche pas
    Par acacia dans le forum C
    Réponses: 49
    Dernier message: 25/01/2008, 16h38

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