PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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.

En 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

edlm a écrit :

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.

En 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

Pied de page des forums