Pour renvoyer une erreur lorsque des périodes se chevauchent, il faut à mon avis procéder en deux étapes : d'abord une fonction indiquant si deux périodes se chevauchent et ensuite un trigger appelant cette fonction pour déterminer s'il y a erreur ou non.
Par exemple, une fonction
CREATE FUNCTION areExclusivePeriods( DATE, DATE, DATE, DATE)
RETURNS boolean AS'
DECLARE
debut1 ALIAS FOR 1ドル;
fin1 ALIAS FOR 2ドル;
debut2 ALIAS FOR 3ドル;
fin2 ALIAS FOR 4ドル;
BEGIN
IF (debut1>fin1) OR (debut2>fin2) THEN
RAISE EXCEPTION ''Périodes mal délimitées (début de période ne précède pas la fin) !'';
END IF;
IF (debut2<debut1 AND fin2<debut1) OR (debut2>fin1 AND fin2>fin1) THEN
RETURN ''t'';
ELSE
RETURN ''f'';
END IF;
END;
' LANGUAGE 'plpgsql';
Cette fonction renvoie 't' lorsque les périodes sont exclusives et 'f' sinon.
puis une deuxième fonction sollicitée par le trigger ; par exemple :
CREATE FUNCTION blabla_insert() RETURNS TRIGGER AS'
DECLARE
rec RECORD;
BEGIN
SELECT INTO rec * FROM blabla WHERE areExclusivePeriods( dat_deb, dat_fin, NEW.dat_deb, NEW.dat_fin )=''f'';
IF FOUND THEN
RAISE EXCEPTION ''Conflit entre les périodes du % au % et du % au %'', rec.dat_deb, rec.dat_fin, NEW.date_deb, NEW.date_fin;
ELSE
RETURN NEW;
END;
END;'
LANGUAGE 'plpgsql';
Enfin le trigger à proprement parler :
CREATE TRIGGER trg_blabla_insert BEFORE INSERT OR UPDATE ON blabla FOR EACH ROW EXECUTE PROCEDURE blabla_insert();
En espérant ne pas être trop à côté de la plaque ...
P.S : découper les périodes si chevauchement il y a devrait être possible, mais je ne l'ai jamais fait ...
En clair c'est jouable à mon avis ! (je vais pas tout faire à ta place non plus !)
# pour renvoyer une erreur
Posté par idiotduvillage . En réponse au message Soucis de SQL..... Évalué à 3.
Par exemple, une fonction
CREATE FUNCTION areExclusivePeriods( DATE, DATE, DATE, DATE)
RETURNS boolean AS'
DECLARE
debut1 ALIAS FOR 1ドル;
fin1 ALIAS FOR 2ドル;
debut2 ALIAS FOR 3ドル;
fin2 ALIAS FOR 4ドル;
BEGIN
IF (debut1>fin1) OR (debut2>fin2) THEN
RAISE EXCEPTION ''Périodes mal délimitées (début de période ne précède pas la fin) !'';
END IF;
IF (debut2<debut1 AND fin2<debut1) OR (debut2>fin1 AND fin2>fin1) THEN
RETURN ''t'';
ELSE
RETURN ''f'';
END IF;
END;
' LANGUAGE 'plpgsql';
Cette fonction renvoie 't' lorsque les périodes sont exclusives et 'f' sinon.
puis une deuxième fonction sollicitée par le trigger ; par exemple :
CREATE FUNCTION blabla_insert() RETURNS TRIGGER AS'
DECLARE
rec RECORD;
BEGIN
SELECT INTO rec * FROM blabla WHERE areExclusivePeriods( dat_deb, dat_fin, NEW.dat_deb, NEW.dat_fin )=''f'';
IF FOUND THEN
RAISE EXCEPTION ''Conflit entre les périodes du % au % et du % au %'', rec.dat_deb, rec.dat_fin, NEW.date_deb, NEW.date_fin;
ELSE
RETURN NEW;
END;
END;'
LANGUAGE 'plpgsql';
Enfin le trigger à proprement parler :
CREATE TRIGGER trg_blabla_insert BEFORE INSERT OR UPDATE ON blabla FOR EACH ROW EXECUTE PROCEDURE blabla_insert();
En espérant ne pas être trop à côté de la plaque ...
P.S : découper les périodes si chevauchement il y a devrait être possible, mais je ne l'ai jamais fait ...
En clair c'est jouable à mon avis ! (je vais pas tout faire à ta place non plus !)