Další (ne)zajímavá novinka z nové verze databáze Temporal Validity. Zkráceně – do tabulky ve které jsou dva datumové sloupce, které pokryvají nějaké časové okno (například sloupce zacatek_platnost, konec_platnost) lze přidat mechanizmus, který zobrazí jen záznamy, které byly v daný čas validní. Technicky vzato je to úplně stejné, jako napsat do podmínky where (moje_datum > zacatek_platnost and moje_datum < konec_platnost). Ačkoliv je to trošku lež. Oracle při přidání filtru handluje pochopiteně ještě i nully. Tedy korektně je to tato podmínka: (((zacatek_platnosti is null or zacatek_platnosti <=moje_datum) and (konec_plastnost is null or konec_platnost>moje_datum))). Ano, takto polouzavřený interval. Takže asi tak A rovnou příklad:
create table tbl_test_temporal_validity
(
id number,
zacatek_platnost date,
konec_platnost date,
period for validni(zacatek_platnost,konec_platnost)
);
A nyní by tam chtělo nasypat nějaká ta data:
insert into tbl_test_temporal_validity select rownum,sysdate-(10-rownum),sysdate+mod(rownum,7) from dual connect by level<11;
Což insertuje nějaká takováto data:
Dnes je 27.1. a mínus 5 dní je 22.1. takže všechny záznamy, které začínají později (23.1.+) nejsou vyselektovány, za zmíňku stojí ještě 22.1., které tam padlo kvůli časové složce, která na obrázku není vidět, takže to může být matoucí ;) A nyní select s temporal validity:
select * from tbl_test_temporal_validity as of period for validni sysdate-5;
Takže asi tak, nějaké poznámky alespoň:
- V exekučním plánu se normálně zobrazuje celá podmínka, jako filtr. Tzn. žádná změna o proti selectu s where, jaký by napsal sám programátor
- V *_tab_cols se sloupec “validni” dá normálně najít a jeho atributy jsou: USER_GENERATED=NO, SEGMENT_COLUMN_ID=null, HIDDEN_COLUMN=yes, VIRTUAL_COLUMN=null, TYP=NUMER
- Do tabulky jde validni přidat až ex-post, pomocí ALTER TABLE ADD.., sloupce definující časové okno musí v tu dobu existovat.
Lehce užitečné, možná to občas použijeme, ale lidskou samičku to rozhodně neohromí