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 :

Tigger afer update


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut Tigger afer update
    Bonjour,

    Je cherche à créer un trigger sur une table qui incrémente la valeur d'un champs sur un enregistrement donné après chaque modification.

    Merci!

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Tu fais un TRIGGER BEFORE UPDATE FOR EACH ROWS
    Et dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :new.compteur := NVL(:old.compteur,0) + 1;

  3. #3
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE TRIGGER trigger_name
        AFTER UPDATE ON table_name
        FOR EACH ROW
    DECLARE
        v_champs1         	table_name.champs1%TYPE;
     
    BEGIN
    :new.champs1:= NVL(:old.champs1,0) + 1;
    END;
    Ne devrais-je pas faire aussi un update sur ce champs comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN
    :new.champs1:= NVL(:old.champs1,0) + 1;
     
    update table_name
    set champs1 = :new.champs1
    where id = v_id (que je déclare ?)
    END;

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Houla surtout pas malheureux !

    Il va falloir que tu regardes une doc sur les triggers (je ne sais pas s'il y en a dans les tutoriels)

    Le premier code est quasi juste :
    C'est BEFORE et v_champs1 ne sert à rien et pas de DECLARE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER trigger_name
        BEFORE UPDATE ON table_name
        FOR EACH ROW
    BEGIN
    :new.champs1:= NVL(:old.champs1,0) + 1;
    END;

  5. #5
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    En fait je voudrais pouvoir dupliquer dans la table l'enregistrement qui a été modifié avec les mêmes données en incrémentant le champs1 comme dit précédemment.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Table1
    ------
    id | champs0  | champs1     | champs2 etc...
    ---------------------------------------
    1  |    aaa   |     0       |  aaaaa
    si je modifie champs2, je voudrais avoir une ligne comme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id | champs0  | champs1       | champs2 etc...
    ---------------------------------------
    1  |    aaa   |    0          |  aaaaa
    2  |    aaa   |    1 (0+1)    |  baaaa
    Merci !

  6. #6
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    CREATE OR REPLACE TRIGGER trigger_name
        BEFORE UPDATE ON table_name
        FOR EACH ROW
    BEGIN
     
    INSERT INTO table_name(champs0,champs1,champs2)
    VALUES(:new.champs0,NVL(:old.champs1,0) +1,:new.champs2)
     
    END;
    J'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [1]: (Error): ORA-04091: table SYSADM.table_name is mutating, trigger/function may not see it ORA-06512: at "SYSADM.trigger_name", line 3 ORA-04088: error during execution of trigger 'SYSADM.trigger_name

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11
  3. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  4. Réponses: 3
    Dernier message: 10/11/2002, 11h03
  5. update et virgule
    Par Delph dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/08/2002, 14h40

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