Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 05/06/2012 07:55:56
- ffred2
- Membre
Problème de manipulation de séquence dans fonction trigger
Bonjour,
J'essaye de faire une fonction qui se déclenche à l'insertion d'un tuple dans une table. En gros quand on entre une réservation pour une chambre, je teste si la chambre est libre dans cette période de temps (test avec OVERLAPS), sinon je regarde si la chambre qui a le numéro suivant et libre, etc. J'utilise une séquence de 1 à 50 qui représente les numéros de chambre. Et j'ai étrangement un erreur sur le LOOP...
ERROR: syntax error at or near "LOOP"
État SQL :42601
Caractère : 621
Et si je mets des guillemets simples pour
PERFORM setval('no_chambre', (i-1));
j'ai une erreur du style
ERROR: syntax error at or near "no_chambre"
État SQL :42601
Caractère : 235
Et voici mon code
DROP SEQUENCE no_chambre;
CREATE SEQUENCE no_chambre
MINVALUE 1
MAXVALUE 50
CYCLE;
CREATE OR REPLACE FUNCTION dispo_chambre() RETURNS TRIGGER AS '
DECLARE
i integer;
BEGIN
i := NEW.chambre;
PERFORM setval("no_chambre", (i-1));
LOOP
SELECT * FROM Reservations
WHERE (Reservations.chambre = nextval("no_chambre"))
AND ((Reservation.date_debut,Reservation.date_fin)
OVERLAPS (NEW.date_debut,NEW.date_fin));
IF NOT FOUND THEN
NEW.chambre := currval("no_chambre");
RETURN NEW;
ELSE IF (currval("no_chambre") = (i -1)) THEN
RETURN NULL;
END IF;
END LOOP;
END;
' LANGUAGE 'plpgsql';
DROP TRIGGER dispo_chambre ON Reservations;
CREATE TRIGGER dispo_chambre BEFORE INSERT OR UPDATE ON Reservations
FOR EACH ROW EXECUTE PROCEDURE dispo_chambre();
Est-ce quelqu'un a une suggestion à me faire? Merci
Dernière modification par ffred2 (05/06/2012 08:08:23)
Hors ligne
#2 05/06/2012 08:59:47
- rjuju
- Administrateur
Re : Problème de manipulation de séquence dans fonction trigger
Bonjour,
vous devez bien mettre le nom de la séquence entre guillemet simple.
Si vous avez une erreur avec cette syntaxe il faudrait le message exact.
Julien.
https://rjuju.github.io/
Hors ligne
#3 05/06/2012 09:08:18
- ffred2
- Membre
Re : Problème de manipulation de séquence dans fonction trigger
J'ai remplacé dans le code ci-dessus tous les guillemets doubles par des simples et j'ai l'erreur suivante:
postgres=# \i /triggers2.sql
DROP SEQUENCE
CREATE SEQUENCE
psql:/triggers2.sql:34: ERROR: syntax error at or near "no_chambre"
LINE 9: PERFORM setval('no_chambre', (i-1));
^
psql:/triggers2.sql:36: ERROR: trigger "dispo_chambre" for table "reservations" does not exist
psql:/triggers2.sql:39: ERROR: function dispo_chambre() does not exist
Hors ligne
#4 05/06/2012 09:15:21
- ffred2
- Membre
Re : Problème de manipulation de séquence dans fonction trigger
Je tiens à préciser que la séquence en elle-même fonctionne (en commande directe tout au moins)
postgres=# SELECT nextval('no_chambre');
nextval
---------
2
(1 row)
Hors ligne
#5 05/06/2012 09:30:10
- edlm
- Membre
Re : Problème de manipulation de séquence dans fonction trigger
Cela n'a peut être (probablement) rien à voir mais je remplacerais les guillemets simples entourant le corps de la fonction
par des $$ et je supprimerais les guillemets simples entourant le nom du langage (LANGUAGE plpgsql au lieu de LANGUAGE 'plpgsql').
Éric
Hors ligne
#6 05/06/2012 09:38:00
- rjuju
- Administrateur
Re : Problème de manipulation de séquence dans fonction trigger
Cela n'a peut être (probablement) rien à voir mais je remplacerais les guillemets simples entourant le corps de la fonction
par des $$ et je supprimerais les guillemets simples entourant le nom du langage (LANGUAGE plpgsql au lieu de LANGUAGE 'plpgsql').
Si si c'est exactement ça. Quand on entoure la fonction avec des ' plutôt que des $$, il faut doubler toutes les simples cotes.
Julien.
https://rjuju.github.io/
Hors ligne
#7 05/06/2012 09:45:39
- ffred2
- Membre
Re : Problème de manipulation de séquence dans fonction trigger
Merci mille fois à vous deux. En effet en entourant la fonction avec des $$, ça marche.
Bonne journée
Hors ligne