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

Requêtes PostgreSQL Discussion :

Réception requête dans fonction trigger


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 68
    Par défaut Réception requête dans fonction trigger
    Bonjour,

    Je suis entrain de réaliser une fonction pour un trigger et lorsque j'essaye de l'enregistrer je reçois une erreur dans l'assignation de la variable dernier_toquage. L'erreur est la suivante :

    ERREUR: erreur de syntaxe sur ou près de « SELECT »
    LINE 1: SELECT SELECT date_toquage FROM projet.toquages WHERE avent...
    ^
    QUERY: SELECT SELECT date_toquage FROM projet.toquages WHERE aventurier_id = $1 AND toquemon_id = $2
    CONTEXT: SQL statement in PL/PgSQL function "est_toquable" near line 7

    ********** Erreur **********

    ERREUR: erreur de syntaxe sur ou près de « SELECT »
    État SQL :42601
    Contexte : SQL statement in PL/PgSQL function "est_toquable" near line 7

    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 projet.est_toquable() RETURNS TRIGGER AS $$
    	-- Existe une variable NEW qui est un tuple (RECORD)
    	dernier_toquage timestamp;
    BEGIN
    	IF (TG_OP = 'INSERT') THEN
    		-- recupere la date du dernier toquage
    		dernier_toquage := SELECT date_toquage FROM projet.toquages WHERE aventurier_id = NEW.aventurier_id AND toquemon_id = NEW.toquemon_id;
     
    		-- si le tokemon n'a jamais été toqué ou si cela remonte à plus d'une semaine
    		IF (dernier_toquage IS NULL) OR (dernier_toquage < NOW() - INTERVAL '7 days') THEN
    			-- Incrementer la table aventurier (nombre_toquage)
    			UPDATE projet.aventuriers SET nombre_toquage = nombre_toquage++ WHERE aventurier_id = NEW.aventurier_id;
    			-- Incrementer la table toquemon (nombre_total_toquage)
    			UPDATE projet.toquemon SET nombre_toquage = nombre_toquage++ WHERE toquemon_id = NEW.toquemon_id;
    		-- sinon
    		ELSE
    			-- on leve une exception (j'ai mit une exception au hazard, faudra vérifier comment les récups en java)
    			RAISE EXCEPTION invalid_transaction_terminaison;
    		END IF;
    	END IF;
    END;
     
    $$ LANGUAGE plpgsql;
    Je ne comprend pas tellement d'où provient l'erreur.

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    et avec ceci est-ce que cela marche mieux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT date_toquage into dernier_toquage FROM projet.toquages WHERE aventurier_id = NEW.aventurier_id AND toquemon_id = NEW.toquemon_id;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 68
    Par défaut
    Je viens de tester et cela ne fonctionne pas non plus.

    Je suis novice dans ce language et j'ai donc une question.

    Dans ma fonction qui sera appelé par le trigger, j'aimerai récupéré une valeur dans la table ou l'insertion va être effectuée pour vérifier s'il n'y pas déjà une entrée qui est dedans depuis moins d'une semaine.

    Je me demande si pour initialisé une variable je dois d'office la déclarer dans DECLARE (et qu'elle ne m'est pas passé par paramètre).

    Ensuite comment faire pour assigner une valeur (qui provient d'une requete, ici le select) et qu'elle soit en integer (ou timestamp) mais je dois pouvoir manipuler dans une condition (juste en dessous dans le code) pour pouvoir vérifier si la date n'est pas inférieure à une semaine.

    J'espère avoir mieux expliqué le problème.

    @Punkoff : je ne comprend pas le INTO dernier_toquage dans la requette ? C'est pour assigner dans la variable dernier_toquage ? ou pour faire référence à une autre entrée ??

    Merci d'avance !

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    A vue d'oeil voici les problèmes que tu dois corriger

    1- dernier_toquage := SELECT date_toquage n'est pas possible , il faut faire le select INTO omme indiqué par punkoff pour assigner la variable

    2- il manque un DECLARE au tout début pour déclarer la variable locale

    3- nombre_toquage++ ne marchera pas en SQL, c'est nombre_toquage+1

    4- ajouter RETURN NEW à la fin de la fonction.

    5- en argument de RAISE EXCEPTION mettre une chaine de caractères au lieu d'un identifiant qui ne va pas exister.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 68
    Par défaut
    Je viens de retenter en prenant en compte toutes les choses que tu m'as dites et pourtant je reçois toujours une erreur.

    J'ai declarer la variable dans DECLARE et j'ai rajouter le INTO dernier_toquage comme dit plus haut (ainsi que les +1 au lieu de ++).

    Je reçois toujours la même erreur qui me cible le SELECT ou au alentour de ce SELECT.

    Voici le code d'erreur ainsi que le code :

    ERREUR: erreur de syntaxe sur ou près de « SELECT »
    LINE 1: SELECT SELECT date_toquage INTO $1 FROM projet.toquages W...
    ^
    QUERY: SELECT SELECT date_toquage INTO $1 FROM projet.toquages WHERE aventurier_id = $2 AND toquemon_id = $3
    CONTEXT: SQL statement in PL/PgSQL function "est_toquable" near line 7

    ********** Erreur **********

    ERREUR: erreur de syntaxe sur ou près de « SELECT »
    État SQL :42601
    Contexte : SQL statement in PL/PgSQL function "est_toquable" near line 7
    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
     
    CREATE FUNCTION projet.est_toquable() RETURNS TRIGGER AS $$
    	-- Existe une variable NEW qui est un tuple (RECORD)
    DECLARE
    	dernier_toquage integer;
    BEGIN
    	IF (TG_OP = 'INSERT') THEN
    		-- recupere la date du dernier toquage
    		dernier_toquage := SELECT date_toquage INTO dernier_toquage FROM projet.toquages WHERE aventurier_id = NEW.aventurier_id AND toquemon_id = NEW.toquemon_id;
    		-- SELECT date_toquage FROM projet.toquages WHERE aventurier_id = NEW.aventurier_id AND toquemon_id = NEW.toquemon_id;
     
    		-- si le tokemon n'a jamais été toqué ou si cela remonte à plus d'une semaine
    		IF (dernier_toquage IS NULL) OR (dernier_toquage < NOW() - INTERVAL '7 days') THEN
    			-- Incrementer la table aventurier (nombre_toquage)
    			UPDATE projet.aventuriers SET nombre_toquage = nombre_toquage+1 WHERE aventurier_id = NEW.aventurier_id;
    			-- Incrementer la table toquemon (nombre_total_toquage)
    			UPDATE projet.toquemon SET nombre_toquage = nombre_toquage+1 WHERE toquemon_id = NEW.toquemon_id;
    		-- sinon
    		ELSE
    			-- on leve une exception (j'ai mit une exception au hazard, faudra vérifier comment les récups en java)
    			RAISE EXCEPTION "Deja toque cette semaine";
    		END IF;
    	END IF;
     
    	RETURN NEW;
    END;
     
    $$ LANGUAGE plpgsql;

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		dernier_toquage := SELECT date_toquage INTO dernier_toquage FROM projet.toquages WHERE aventurier_id = NEW.aventurier_id AND toquemon_id = NEW.toquemon_id;
    Il faut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		SELECT date_toquage INTO dernier_toquage FROM projet.toquages WHERE aventurier_id = NEW.aventurier_id AND toquemon_id = NEW.toquemon_id;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2014, 11h58
  2. [8.3] Syntaxe requête dans fonction
    Par apidou dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/06/2013, 09h41
  3. Réponses: 21
    Dernier message: 12/06/2010, 16h55
  4. [SQL SERVER 2005]problème requête dans un trigger
    Par Kropernic dans le forum Développement
    Réponses: 14
    Dernier message: 02/03/2010, 18h20
  5. problème d'update dans une fonction trigger (before)
    Par ctobini dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/09/2006, 17h08

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