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

PostgreSQL Discussion :

problème d'update dans une fonction trigger (before)


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut problème d'update dans une fonction trigger (before)
    Bonjour,

    J'ai un petit problème entre 2 tables :

    symbole :
    symb_id SERIAL <pk>
    compteur SERIAL
    symb TEXT

    1:n
    1:1

    gids
    gid_id INTEGER UNIQUE NOT NULL <pk>
    symb_id INTEGER NOT NULL <fk symbole(symb_id)>

    Je voudrais créer une fonction trigger permettant de vérifier, avant 'insertion d'un mot dans symbole(symb) si ce mot est déjà saisi, si c'est le cas, il faut mettre à jour gids(symb_id) pour la dernière valeur du compteur :

    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 FUNCTION check_symbole_before() RETURNS OPAQUE AS '
            DECLARE
             symb_curr TEXT;
             last_symb_id INTEGER;
             last_gid_compt INTEGER;
            BEGIN
             last_symb_id := (SELECT symb_id FROM symbole ORDER BY symb_id DESC LIMIT 1);
             last_gid_compt := (SELECT compt FROM gids ORDER BY compt DESC LIMIT 1);
             RAISE WARNING ''Dernier compteur GID: % et dernier symb_id: %'', last_gid_compt, last_symb_id;
             SELECT INTO symb_curr symb FROM symbole WHERE symb = NEW.symb;
            IF FOUND THEN
             UPDATE gids SET symb_id = last_symb_id WHERE compt = last_gid_compt;
             RAISE EXCEPTION ''symb_id duplique => table gids mise a jour'';
            END IF;
            RETURN NEW;
            END;
            ' LANGUAGE 'PLPGSQL';
     
    CREATE TRIGGER symbole_trigger_before BEFORE INSERT
            ON symbole
            FOR EACH ROW
            EXECUTE PROCEDURE check_symbole_before();
    Mon problème est que la mise à jour UPDATE dans la boucle IF FOUND ne s'effectue pas.

    Y aurait-il un soucis dans ce genre de structure ?

    En vous remerciant,

    C. Tobini

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Je viens de m'apercevoir que l'EXCEPTION empêchait le déroulement de tout l'INSERT, ce que je voulais faire à la base afin d'effectuer l'UPDATE mais conserver la dernière valeur de la table.

    En revanche, du coup, une nouvelle valeur est ajoutée à la table symbole et je me retrouve avec une valeur dupliquée.

    Serait-il possible d'effectuer l'UPDATE sans pour autant faire l'INSERT ?

    C. Tobini

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/03/2007, 16h35
  2. Réponses: 14
    Dernier message: 10/01/2007, 11h12
  3. problème de variable dans une fonction
    Par K4trix dans le forum C
    Réponses: 9
    Dernier message: 06/07/2006, 10h38
  4. [Pl/Sql] Insert ou Update dans une fonction
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 12
    Dernier message: 18/04/2006, 16h28
  5. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 16h50

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