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

#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

Pied de page des forums

Propulsé par FluxBB