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 à condition sous ORACLE


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    géomaticien
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 0
    Points
    0
    Par défaut Trigger à condition sous ORACLE
    Bonjour,
    Dans une appli de gestion dont le SGBD est Oracle Locator je souhaiterai ajouter un trigger à condition:

    remplir automatiquement le champ date du prochain remplacement = date de pose + 12 ans

    Le principe ci-dessus est le suivant cependant j'obtiens une erreur.

    Voici ce que j'ai utilisé comme syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create trigger MONTRIGGER after update on MATABLE for each row
    begin
    if (:new.ID_REF_BANC := '1') then
    insert into DATE_PROCH_RPLT := (DATE_POSE,interval 12 year);
    end if;
    end;
    Merci à vous

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par SIG_carene Voir le message
    cependant j'obtiens une erreur.
    En nous donnant le message d'erreur, ce serait plus plus facile pour t'aider à la corriger...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    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
    Utilisez un trigger BEFORE UPDATE, et remplacez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into DATE_PROCH_RPLT := (DATE_POSE,interval 12 year);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :DATE_PROCH_RPLT := add_months(:new.DATE_POSE, 12*12 );
    Ne faudrait-il pas aussi gérer le cas BEFORE INSERT ?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    géomaticien
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 0
    Points
    0
    Par défaut voici le message d'erreur
    voici le message d'erreur :
    ORA-04098: Déclencheur 'MONTRIGGER' non valide. Echec de la revalidation
    J'ai exécuté la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW ERRORS TRIGGER "MONTRIGGER" ;
    et voici le résultat:

    2/22 PLS-00103: Symbole "=" rencontré à la place d'un des symboles suivants :

    . ( ) , * @ % & = - + < / > at in is mod remainder not rem =>
    <exposant (**)> <> or != or ~= >= <= <> and or like like2
    like4 likec as between || indicator multiset member
    submultiset
    Symbole ", inséré avant "=" pour continuer.

    3/29 PLS-00103: Symbole "=" rencontré à la place d'un des symboles suivants :

    . ( @ select <identificateur>
    <identificateur entre guillemets> partition subpartition
    values

    3/52 PLS-00103: Symbole "12" rencontré à la place d'un des symboles suivants :

    . ) , * @ & = - + < / > at in is mod remainder not rem =>
    <exposant (**)> <> or != or ~= >= <= <> and or like like2
    like4 likec between || multiset member
    <une chaîne SQL entre apostrophes> submultiset
    merci

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    géomaticien
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 0
    Points
    0
    Par défaut suite
    J'ai indiqué le message d'erreur au même moment que tu m'as répondu.

    je suis d'accord qu'il faut que je gère le BEFORE INSERT d'où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER "GEO_ESP_PUBLIC"."TRG_VOI_BANC_DV" 
    BEFORE INSERT OR UPDATE ON GEO_ESP_PUBLIC.VOI_BANC_MAJ FOR EACH ROW
    BEGIN
    if (:new.ID_REF_BANC := '1') then
    insert into :DATE_PROCH_RPLT := add_months(:new.DATE_POSE, 12*12 );
    end if;
    end;
    cependant même erreur.

    merci

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Date_proch_rplt, c'est une autre table, dans laquelle tu veux insérer une ligne ? Forcément oui, puisque ta commande est insert into Date_Proch_rplt.

    Et dans cette autre table, il y a juste une colonne de type date, sans identifiant de produit ?

    Bizarre.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    géomaticien
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Non, c'est là où je bloque car c'est dans la même table

    exemple: MATABLE à renseigner est constitué des champs suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID_REF_BANC	NUMBER(10,0)	No	99 
    DATE_PROCH_RPLT	DATE	Yes	
    DATE_POSE	DATE	Yes
    et j'ai une table de nomenclature "REFERENCE" dans laquelle ID_REF est en foreign_key avec ID_REF_BANC

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    insert into , ça insère une ligne dans une table. Point final.

    Donc dans ton 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
     
    CREATE OR REPLACE TRIGGER "GEO_ESP_PUBLIC"."TRG_VOI_BANC_DV_INS" 
    BEFORE INSERT ON GEO_ESP_PUBLIC.VOI_BANC_MAJ FOR EACH ROW
    BEGIN
    if (:new.ID_REF_BANC := '1') then
    insert into GEO_ESP_PUBLIC.VOI_BANC_MAJ (  ID_REF_BANC, DATE_PROCH_RPLT	,	DATE_POSE ) 
    values (   nexw.id_ref_banc,   add_months(:new.DATE_POSE, 12*12 )  , new.date_Pose ) ;
    end if;
    end;
     
     
    CREATE OR REPLACE TRIGGER "GEO_ESP_PUBLIC"."TRG_VOI_BANC_DV_UPD" 
    BEFORE UPDATE ON GEO_ESP_PUBLIC.VOI_BANC_MAJ FOR EACH ROW
    BEGIN
    if (:new.ID_REF_BANC := '1')  then
    update  GEO_ESP_PUBLIC.VOI_BANC_MAJ set   DATE_PROCH_RPLT	= add_months(:new.DATE_POSE, 12*12 )  , 	DATE_POSE = :new.date_pose where ID_REF_BANC = :new.id_ref_blanc ; 
    end if ;  
    end;
    Je ne suis pas sur de la syntaxe, et il y a peut être plus simple (je pense que oui après coup), mais en gros, c'est ça.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    géomaticien
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    merci pour ton aide je vais voir.
    bon weekend

  10. #10
    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
    J'avais oublié un new dans ma réponse ci-dessus, essayez comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE TRIGGER "GEO_ESP_PUBLIC"."TRG_VOI_BANC_DV_UPD" 
    BEFORE INSERT OR UPDATE ON GEO_ESP_PUBLIC.VOI_BANC_MAJ FOR EACH ROW
    BEGIN
    if (:new.ID_REF_BANC := '1')  then
        :new.DATE_PROCH_RPLT := add_months(:new.DATE_POSE, 12*12 );
    end if ;  
    end;
    /
    Pas besoin d'insert ou d'update, il suffit de manipuler les colonnes avec :new.

  11. #11
    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
    Je pense que l'erreur vient de là :
    if :new.ID_REF_BANC := '1' ?

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if :new.ID_REF_BANC = '1'
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Au niveau syntaxe, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create trigger MONTRIGGER after update on MATABLE for each row
    begin
    if (:new.ID_REF_BANC = '1') then
      :new.DATE_PROCH_RPLT := (DATE_POSE,interval 12 year);
    end if;
    end;

  13. #13
    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
    Citation Envoyé par Cincinnatus Voir le message
    Au niveau syntaxe, ce serait plutôt :
    Je ne crois pas, non...
    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
    SQL> create table test_trigger (c1 date, c2 date);
     
    Table creee.
     
    SQL> create trigger MONTRIGGER
    after update on test_trigger
    for each row
    begin
      :new.C2 := (C1,interval 12 year);
    end;
    /  2    3    4    5    6    7
     
    Avertissement : Declencheur cree avec erreurs de compilation.
     
    SQL> show err
    Erreurs pour TRIGGER MONTRIGGER :
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    2/27     PLS-00103: Symbole "12" rencontre a la place d'un des symboles
             suivants :
             . ) , * @ & = - + < / > at in is mod remainder not rem =>
             <exposant (**)> <> or != or ~= >= <= <> and or like like2
             like4 likec between || multiset member
             <une chaine SQL entre apostrophes> submultiset
             Symbole "<une chaine SQL entre apostrophes> insere avant "12"
             pour continuer.
     
    SQL> create or replace trigger trig_add_date
    before insert on test_trigger
    FOR EACH ROW
    BEGIN
        :new.C2 := add_months(:new.C1, 12*12 );
    end;
    /  2    3    4    5    6    7
     
    Declencheur cree.
     
    SQL>

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/06/2011, 16h30
  2. trigger sous oracle
    Par oOmanOo dans le forum PL/SQL
    Réponses: 1
    Dernier message: 23/05/2011, 09h31
  3. Trigger sous oracle ne fonctionne pas !
    Par ychaabani dans le forum PL/SQL
    Réponses: 4
    Dernier message: 08/02/2010, 10h24
  4. création de trigger sous oracle 9i
    Par bkina dans le forum PL/SQL
    Réponses: 2
    Dernier message: 12/11/2007, 13h58
  5. Trigger sous oracle
    Par arezki76 dans le forum Oracle
    Réponses: 3
    Dernier message: 31/08/2006, 12h49

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