CURRENT_DATE Oracle - PullRequest
       12

CURRENT_DATE Oracle

1 голос
/ 16 июня 2019

Мне трудно добавить новый столбец даты рождения с возрастом правила проверки между 18 и 65. Я использую sqplus с Oracle Alway, получая сообщение об ошибке ORA00920 Нужна ваша помощь, пожалуйста

ALTER TABLE Vendeur ADD (dateNaissance DATE, 
            dateDebutProjet DATE NOT NULL,  
            DateFinProjet DATE NOT NULL,
            CONSTRAINT chk_date_Birth CHECK ((TRUNC(CURRENT_DATE)-dateNaissance) 
            BETWEEN 18 AND 65),
            CONSTRAINT chk_date_Projet CHECK (DateFinProjet > dateDebutProjet));

Ответы [ 2 ]

1 голос
/ 13 июля 2019

, если это может помочь, решение без триггеров (так как мы не изучали hem в то время):

ALTER TABLE Vendeur ADD (dateNaissance DATE, debutProjet DATE DEFAULT '01/01/1000' NOT NULL, finProjet DATE DEFAULT '02/01/1000' NOT NULL, dateDuJour Date DEFAULT CURRENT_DATE, CONSTRAINT chk_date_Projet CHECK (finProjet > debutProjet), CONSTRAINT chk_date_Birth CHECK ((dateDuJour - dateNaissance)\365 BETWEEN 18 AND 65) );

0 голосов
/ 17 июня 2019

Проверка ограничений не может вызывать недетерминированные функции, такие как CURRENT_DATE . Предполагается, что проверочные ограничения всегда выполняются, могут возникнуть странные вещи, если проверочные ограничения устареют.

В приведенном ниже примере кода показана одна из ошибок, которые вы можете получить, пытаясь использовать CURRENT_DATE в проверочном ограничении:

SQL> create table test1(a date);

Table created.

SQL> alter table test1 add constraint test1_ck1 check(a > date '2000-01-01');

Table altered.

SQL> alter table test1 add constraint test1_ck2 check(a > current_date);
alter table test1 add constraint test1_ck2 check(a > current_date)
                                                     *
ERROR at line 1:
ORA-02436: date or system variable wrongly specified in CHECK constraint

Создайте триггер, чтобы обойти эту проблему:

create or replace trigger test1_date_gt_today
before update or insert of a on test1
for each row
begin
    if :new.a is null or :new.a < current_date then
        raise_application_error(-20000, 'The date cannot be earlier than today.');
    end if;
end;
/

Ниже приведен пример работы одной INSERT, и одна не соответствует условию в триггере:

SQL> insert into test1 values(sysdate + 1);

1 row created.

SQL> insert into test1 values(sysdate - 1);
insert into test1 values(sysdate - 1)
            *
ERROR at line 1:
ORA-20000: The date cannot be earlier than today.
ORA-06512: at "JHELLER.TEST1_DATE_GT_TODAY", line 3
ORA-04088: error during execution of trigger 'JHELLER.TEST1_DATE_GT_TODAY'
...