Проблемы с вашим кодом:
в конце этого выражения стоит точка с запятой, которой не должно быть IF(minutos > 120);
(обратите внимание, что скобки лишние, так как комментарий Уильяма Робертсона)
raise_application_error()
ожидает два аргумента: номер ошибки (от -20999
до -20000
) и сообщение
подстановка DATE
s производит число, которое представляет их разницу в дней ; как таковой, ваш код гарантирует, что разница составляет менее 120 дней, что, насколько это касается, не то, что вы хотите.
Вот правильная версия вашего кода:
CREATE OR REPLACE TRIGGER HorarioReseva
BEFORE INSERT OR UPDATE ON RESERVAS
FOR EACH ROW
DECLARE
minutos NUMBER;
BEGIN
minutos := :NEW.HoraFin - :NEW.HoraInicio;
IF minutos > 2/24
THEN raise_application_error(
-20000,
'No se puede reservar una pista durante más de 2h(120min)'
);
END IF;
END;
/
Но в основном: вы хотите убедиться, что разница между HoraFin
и HoraInicio
не превышает 2 часов. Для этого вам не нужен триггер: достаточно ограничения CHECK
.
CREATE TABLE RESERVAS (
OID_RE NUMBER NOT NULL,
PrecioReserva INTEGER NOT NULL,
fecha DATE NOT NULL,
HoraInicio DATE NOT NULL,
HoraFin DATE NOT NULL,
OID_ESC NUMBER,
OID_SOC NUMBER,
OID_PIS NUMBER NOT NULL,
CHECK(HoraFin - HoraInicio <= 2/24)
);
Демонстрация на DB Fiddle :
insert into reservas (OID_RE, PrecioReserva, fecha, HoraInicio, HoraFin, OID_PIS)
values(
1,
2,
to_date('2019-01-01', 'yyyy-mm-dd'),
to_date('2019-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),
to_date('2019-01-01 02:00:00', 'yyyy-mm-dd hh24:mi:ss'),
1
);
--> 1 rows affected
insert into reservas (OID_RE, PrecioReserva, fecha, HoraInicio, HoraFin, OID_PIS)
values(
1,
2,
to_date('2019-01-01', 'yyyy-mm-dd'),
to_date('2019-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),
to_date('2019-01-01 02:01:00', 'yyyy-mm-dd hh24:mi:ss'),
1
);
--> ORA-02290: check constraint (FIDDLE_LTVQMOQEMVHALMINECEI.SYS_C00308788) violated