Oracle- Check datetime
Kluvanek Martin
kluvanek na tesnet.cz
Úterý Říjen 28 13:38:02 CET 2003
Honza Pazdziora wrote:
> On Mon, Oct 27, 2003 at 07:37:36PM +0100, Kluvanek Martin wrote:
>
>>Ked som chcel obmedzit, aby sa nestrkali zaznamy napriklad novsie ako
>>SYSDATE.
>>Spravil som takyto pokus:
>>
>>create table EMPLOYEE
>>(Birthdate DATE check(BirthDate <= SysDate));
>>
>>Vysledok je:
>>ORA-02436: v kontrolním omezení je chybně definovaná datumová či systémová
>>proměnná
>>
>>Pritom som to pouzil identicky ako v
>>http://www.embarcadero.com/news/auditdatevalues.asp
>
>
> ... a přesně o chybě ORA-02436 se v tom článku také píše, spolu se
> zdůvodněním.
Prave ze nie.
Tam sa len vysvetluje, ze pri importe dat v buducnosti by mohla toto CHECK
obmedzenie sposobit problemy (rozumel som LOGICKE a nie implementacne). To je
pravda ale 1)importe neplanujem 2)pocas importu mozem podmienku(y) docasne
zrusit. (samozrejme moj problem je trochu ineho razenia a tam k takejto logickej
komplikaci nemoze dojst vobec)
ORA-02436 sa tam spomina len v suvislosti s pouzitim obmedzenia pevnym datumom
kde je rok len v 2miestnom formate '01-JAN-10' koli nejednoznacnosti
specifikacie roku.
Podla mna tam nieje ani slovo zmienky o tom, ze je pouzitie sysdate v CHECK
zakazane ale len nevhodne.
S tym 2miestnym rokom som si tiez pekne uzil :-)
Pouzivam nls_date_format="DD.MM.YY HH24:MI:SS" a preto ma prekvapilo ze ked pri
vstupe datumu zadam
01.02.03 01:02:03 tak dostanem rok 0003
kdezto pre
01.02.03 11:02:03 dostanem rok 2003
(pisem to z pamati takze je mozne ze to nieje uplne do puntiku presne)
Takze aplikacia ktora si vyziadala data z obdobia od
8.9.03 01:00 do 8.9.03 23:00 v skutocnosti obdrzala data od zaciatku chodu
systemu z coho mala niekolko hodin hlavu v pejru.
:-))
Naproti tomu musim uznat, ze ma prijemne prekvapila zmena ked som previedol
tabulku typu
cas,zariadenie,vstup (primarny kluc) + 3 datove polia
kde v jednom case pre jedno zariadenie existuje sucasne 96 takychto zaznamov
na tabulku typu
cas,zariadenie (primarny kluc) + 3 polia typu VARRAY(96)
V jednom case pre jedno zariadenie len jediny (vacsi) zaznam
Povodna tabulka mala totiz 76 mil poloziek a nova 96xmenej.
Tym padom bol index 96x mensi a navyse sa uz asi vliezol do pamate. (system ma
len 1GB RAM)
Povodne napriklad export (vlozenou procedurou) 1 tyzdna dat
(cca 100tis zaznamov 3xnumber) trval asi 1300sekund (a pre kratsie useky dat
trval stejne dlho )
Po uprave (cca 10 tisic zaznamov 3xVARRAY) to chodi za 35sekund pricom pre
kratsie useky to je linearne kratsie.
Mal som z toho strach, ze to bude
1)komplikovane na inplementaciu
2)narocne na vykon ORACLE
ale opak je pravdou.
Mozem doporucit pre velky cocet zaznamov a polozky v ktorych nieje nutne sa
priliz detailne prehrabovat.
> Ano. Check je statické omezení kladené na hodnoty v tabulkách. Oproti
> tomu trigger Vám dovoluje vrátit chybu při akci nad daty. To že Vy
> víte, že funkce sysdate je monotónní, ještě neznamená, že to ví
> Oracle, a taky to neznamená, že se najednou nestane, že někdo bude
> chtít ta data naimportovat do databáze, kde bude sysdate o tři roky
> nazpět. Kde by ta samá data už nebyla validní. Test s použitím sysdate
> tedy není námět pro check, anýbrž pro trigger.
Suhlasim, trigger ma ovela sirsie moznosti, len ma prekvapilo, ze som nikde
nenasiel, ze to je ZAKAZANE.
--
Martin Kluvanek
ved.odd. vyvoje (head of development department)
TES s.r.o
Testovani Energetickych Systemu (Testing of Energetical Systems)
Prazska 597
674 01 Trebic
Czech republic
tel:568 8384 28 (+420 5688384 28)
fax:568 8384 27 (+420 5688384 27)
homepage: http://www.tesnet.cz
Další informace o konferenci Test