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

SQL Oracle Discussion :

Erreur de compilation trigger


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut Erreur de compilation trigger
    Bonjour,

    Je ne suis pas un utilisateur de trigger en général, c'est pour ceci que je viens demander votre aide car je ne trouve aucun moyen de résoudre mon problème...

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    CREATE OR REPLACE TRIGGER INS_UPD_bkizcprt
       AFTER INSERT OR UPDATE ON BKIZCPRT
       FOR EACH ROW
     
       DECLARE
          f_sit_cent              CHAR(5)  := '99000';
          f_date_comptable1       CHAR(8)  := '02011900';
          f_date_comptable2       CHAR(8)  := '02011900';
          CURSOR cur_bkizcprt
             IS
             SELECT * FROM bkizcprt
             AND   age  = :OLD.age
             AND   ope  = :OLD.ope
             AND   eve  = :OLD.eve
             AND   ave  = :OLD.ave
             AND  iden  = :OLD.iden
             AND  lang  = :OLD.lang;
     
          f_bkizcprt cur_bkizcprt%ROWTYPE;
     
          CURSOR cur_sit_cent
             IS
             SELECT MNT1
             FROM BKNOM
             WHERE CTAB = '098'
             AND CACC = 'CENT';
     
          CURSOR cur_date_comptable
             IS
             SELECT MNT1, MNT2
             FROM BKNOM
             WHERE CTAB = '001'
             AND CACC = f_sit_cent
             AND AGE = f_sit_cent;
     
       BEGIN
          OPEN cur_bkizcprt;
          FETCH cur_bkizcprt INTO f_bkizcprt;
          IF cur_bkizcprt%FOUND THEN
             -- Recherche du site central
             OPEN cur_sit_cent;
             FETCH cur_sit_cent INTO f_sit_cent;
     
             IF cur_sit_cent%FOUND THEN
                -- Recherche de la date comptable
                OPEN cur_date_comptable;
                FETCH cur_date_comptable INTO f_date_comptable1, f_date_comptable2;
     
                IF cur_date_comptable%FOUND THEN
                   -- Quelle est la bonne date comptable ?
                   IF f_date_comptable2 IS NULL THEN
                      :NEW.date_dermodif := f_date_comptable1;
                   ELSE
                      :NEW.date_dermodif := f_date_comptable2;
                   END IF;
                END IF;
             END IF;
     
             UPDATE bkizcprt SET
             date_dermodif  = to_date(:NEW.date_dermodif)    --Date de modifcation
             WHERE age = :OLD.age
             AND   ope = :OLD.ope
             AND   eve = :OLD.eve
             AND   ave = :OLD.ave
             AND  iden = :OLD.iden
             AND  lang = :OLD.lang
             ;
     
          END IF;
       END;
       /
     
    SHOW errors;
     
    exit;
    Il s'avère que en essayant d'exécuter avec sqlplus voici les erreurs que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    7/10     PL/SQL: SQL Statement ignored
    8/10     PL/SQL: ORA-00933: la commande SQL ne se termine pas correctement
    Cependant, je trouve que cela ne correspond à rien...
    Si une âme charitable pouvait m'aider svp.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    J'ai l'impression que ce que vous faites est beaucoup trop compliqué et peut se résumer à (attention, code non testé) :
    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 INS_UPD_bkizcprt
    AFTER INSERT OR UPDATE ON BKIZCPRT
    FOR EACH ROW
     
    BEGIN
     
        SELECT to_date(coalesce(mnt2, mnt1), '<fmt>') -- Quel format ?
          INTO :new.date_dermodif
          FROM BKNOM
         WHERE CTAB = '001'
           AND (CACC, AGE) = (SELECT mnt1, mnt1
                                FROM BKNOM
                               WHERE CTAB = '098'
                                 AND CACC = 'CENT');
     
    END;
    /

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut
    Merci tout d'abbord d'avoir pris le temps de regarder !!!!

    Effectivement ce que vous avez fait simplifie grandement !!!
    Cependant avec cette manière l'update est implicite??

    Si c'est le cas j'imagine que il faut mettre BEFORE au lieu de AFTER INSERT OR UPDATE ?

    Ce qui donnerait ça :

    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
    CREATE OR REPLACE TRIGGER INS_UPD_bkizcprt
    BEFORE INSERT OR UPDATE ON BKIZCPRT
    FOR EACH ROW
     
    BEGIN
       SELECT to_date(coalesce(mnt2, mnt1), 'YYYY-MM-DD HH:MI:SS')
       INTO :new.date_dermodif
       FROM BKNOM
       WHERE CTAB = '001'
       AND (CACC, AGE) = (SELECT mnt1, mnt1
                          FROM BKNOM
                          WHERE CTAB = '098'
                          AND CACC = 'CENT');
     
    END;
    /
    Je test.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 369
    Par défaut
    Désolé pour le double post...

    Mais merci beaucoup chef Waldar !!!

    C'est parfait comme ça.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    De rien, et vous avez tout à fait raison pour le BEFORE !

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

Discussions similaires

  1. Erreur lors de compilation trigger
    Par Hypnoze dans le forum PL/SQL
    Réponses: 8
    Dernier message: 24/04/2012, 10h01
  2. [Trigger]Erreur de Compilation
    Par Knarf64 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 10/10/2009, 19h30
  3. Réponses: 4
    Dernier message: 03/09/2008, 01h44
  4. Réponses: 5
    Dernier message: 25/04/2006, 01h02
  5. [10g] Trigger erreur de compilation
    Par flasomm dans le forum Oracle
    Réponses: 2
    Dernier message: 03/01/2006, 03h07

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