ОШИБКА: PLS-00103: Обнаружен символ ";" при ожидании одного из следующих действий: * & = - + </> at in is mod остаток не rem затем - PullRequest
1 голос
/ 10 января 2020

Это проект для университета, и мне нужна помощь :( В чем проблема ??

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
);

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 > 120);
        THEN  raise_application_error
        ('No se puede reservar una pista durante más de 2h(120min)');
     END IF;
END;

1 Ответ

3 голосов
/ 10 января 2020

Проблемы с вашим кодом:

  • в конце этого выражения стоит точка с запятой, которой не должно быть 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
...