Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 Re : PL/pgSQL » Problème de manipulation de séquence dans fonction trigger » 05/06/2012 09:45:39
Merci mille fois à vous deux. En effet en entourant la fonction avec des $$, ça marche.
Bonne journée
#2 Re : PL/pgSQL » Problème de manipulation de séquence dans fonction trigger » 05/06/2012 09:15:21
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)
#3 Re : PL/pgSQL » Problème de manipulation de séquence dans fonction trigger » 05/06/2012 09:08:18
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
#4 PL/pgSQL » Problème de manipulation de séquence dans fonction trigger » 05/06/2012 07:55:56
- ffred2
- Réponses : 6
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
Pages : 1