Ограничение даты - PullRequest
       31

Ограничение даты

0 голосов
/ 21 марта 2020

Мне нужно проверочное ограничение для даты, чтобы данные не могли быть введены в прошлом. Я использую oracle live SQL для школьного проекта и не могу найти решение.

(BookingID Varchar2(6) PRIMARY KEY NOT NULL,
App_Date Date NOT NULL, 
App_Time varchar2(8) NOT NULL,
Location Varchar2(15) NOT NULL, 
Query Varchar(50) NOT NULL);

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Oracle интерпретирует ограничения check как вечные ограничения для данных. То есть проверочное ограничение действует не только при изменении данных, но и навсегда после этого.

По этой причине Oracle не допускает изменчивых функций в ограничениях check. Энергозависимая функция - это функция, значения которой могут меняться со временем. Очень хорошим примером являются функции даты / времени, такие как sysdate (это действительно функция без скобок).

Таким образом, вы не можете делать то, что хотите, с ограничением check. Вам нужно установить это, используя insert триггер.

0 голосов
/ 21 марта 2020

Вы не можете использовать sysdate в проверочном ограничении, потому что, как объяснил Гордон Линофф, это недетерминированная c функция (ie значение, которое она дает, не является постоянным во времени).

Вместо этого вы можете реализовать проверку с помощью триггера:

create or replace trigger app_date_not_in_past
    before insert or update on mytable
    for each row
begin
    if (:new.app_date < sysdate)
    then
        raise_application_error( -20001, 'app_date date must not  be in the past' );
    end if;
end;
/
...