Dans votre commentaire sur la réponse de mathguy, vous dites "J'essaie également de m'assurer que la période de temps des nouvelles entrées ne chevauche pas les entrées existantes." J'ai fait cela avec des vues matérialisées "rafraîchir rapidement sur le commit". Attention : Les rafraîchissements "rapides" peuvent être lents si vous ne faites pas attention, veuillez vous référer à ce blog. http://www.adellera.it/ notamment en ce qui concerne statistiques sur le journal de la vue matérialisée.
Je suppose que les dates de fin sont exclusives. Si une date de fin est nulle, cela signifie que la plage de dates se poursuit indéfiniment. De nombreux chevauchements seront immédiatement détectés par la clé primaire et les contraintes uniques. Les autres seront détectés au moment de la validation par la contrainte sur la vue matérialisée. Notez qu'à la fin de la transaction, le MV n'aura jamais de lignes.
SQL> create table date_ranges (
2 key1, start_date,
3 primary key(key1, start_date),
4 end_date,
5 unique(key1, end_date),
6 check(start_date < end_date)
7 )
8 as
9 with a as (select date '2000-01-01' dte from dual)
10 select 1, dte, dte+1 from a
11 union all
12 select 1, dte+1, dte+2 from a
13 union all
14 select 1, dte-1, dte from a
15 union all
16 select 2, dte+10, dte+11 from a
17 union all
18 select 2, dte+12, dte+13 from a
19 union all
20 select 2, dte+8, dte+9 from a
21 /
Table DATE_RANGES created.
SQL> create materialized view log on date_ranges
2 with sequence, rowid, primary key, commit scn (end_date) including new values
3 /
Materialized view log DATE_RANGES created.
SQL> create materialized view overlapping_ranges refresh fast on commit
2 as
3 select a.rowid arid, b.rowid brid
4 from date_ranges a, date_ranges b
5 where a.key1 = b.key1
6 and a.rowid != b.rowid
7 and a.start_date < b.end_date
8 and a.end_date > b.start_date;
Materialized view OVERLAPPING_RANGES created.
SQL>
SQL> alter materialized view overlapping_ranges
2 add constraint overlaps_not_allowed check (1=0) deferrable initially deferred
3 /
Materialized view OVERLAPPING_RANGES altered.
SQL> insert into date_ranges select 1, date '1999-12-30', date '2000-01-4' from dual;
1 row inserted.
SQL> commit;
Error starting at line : 42 in command -
commit
Error report -
ORA-02091: transaction rolled back
ORA-02290: check constraint (STEW.OVERLAPS_NOT_ALLOWED) violated