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
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 368
    Points : 22 239
    Points
    22 239

    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 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 585
    Points : 4 977
    Points
    4 977

    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
    1 402
    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 : 1 402
    Points : 2 954
    Points
    2 954

    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
    1 402
    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 : 1 402
    Points : 2 954
    Points
    2 954

    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 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 585
    Points : 4 977
    Points
    4 977

    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 005
    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 005
    Points : 6 276
    Points
    6 276
    Billets dans le blog
    3

    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

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