• # pour renvoyer une erreur

    Posté par . En réponse au message Soucis de SQL..... Évalué à 3.

    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 !)