Скажите, что ваша таблица - tab1, дата начала - stdate, а дата окончания - endate
также пусть новая начальная дата и новая конечная дата будут в переменных PLSQL v_stdate и v_endate.
так что ваша вставка может быть что-то вроде
insert into tab1 (stdate,endate)
select v_stdate,v_endate from dual
where not exists(
select 'overlap' from tab1 t1
where v_stdate between(t1.stdate and nvl(t1.endate,v_endate)
or v_endate between(t1.stdate and nvl(t1.endate,v_endate)
)
Решение этой проблемы немного сложнее из-за проблем параллелизма. В вашем случае вы планируете событие (или ресурс). Итак, я полагаю, у вас есть таблица, которая содержит ресурс (скажем, клиент). Прежде чем добавить другое расписание (или событие) для клиента, вы должны заблокировать конкретную запись клиента, например.
select client_id from Clients where client_id=p_client_id for update;
Затем вы можете проверить, нет ли перекрытий, вставить новое расписание и зафиксировать. На этом этапе блокировка будет снята. Любое решение, не использующее объект сериализации, обязательно будет иметь недостатки из-за проблем параллелизма. это в вашей PLSQL или в триггере после вставки. Но это абсолютно необходимо для блокировки фактической записи ресурса.