Как исправить триггер с ошибкой журнала проверки компилятора? - PullRequest
0 голосов
/ 07 мая 2020

Помогите, пожалуйста!

У меня есть триггер:

CREATE TRIGGER check_reservation BEFORE INSERT ON order
FOR EACH ROW
DECLARE mistake INTEGER;
BEGIN
  SELECT count(*) INTO mistake FROM order join reserving 
  on id_order = reserving.order_id_order
  WHERE reserving.room_num_room=:new.room_num_room
  AND  (order.reservation_from < :new.reservation_from AND :new.reservation_from < order.reservation_to) OR 
       (order.reservation_from < :new.reservation_from AND :new.reservation_to < order.reservation_to) OR
       (:new.reservation_from <= order.reservation_from AND order.reservation_to <= :new.reservation_to); 
  IF mistake>0 THEN
    raise_application_error(-20001,'reservation already exists');
  END IF;
END;

Идея триггера заключается в том, чтобы не позволять бронировать уже забронированный номер. Когда я запустил его, у меня появилось сообщение об ошибке журнала компилятора. Как я могу изменить триггер? У меня есть следующие таблицы:

CREATE TABLE order (
    id_order                CHAR(100) NOT NULL,
    reservation_from        DATE NOT NULL,
    reservation_to          DATE NOT NULL,
);

ALTER TABLE order ADD CONSTRAINT order_pk PRIMARY KEY ( id_order );

CREATE TABLE room (
    num_room      CHAR(100) NOT NULL,
    type          VARCHAR2(100) NOT NULL,
);

ALTER TABLE room ADD CONSTRAINT room_pk PRIMARY KEY ( num_room );

CREATE TABLE reserving (
    room_num_room         CHAR(100) NOT NULL,
    order_id_order        CHAR(100) NOT NULL
);

ALTER TABLE reserving ADD CONSTRAINT reserving_pk PRIMARY KEY ( room_num_room,
                                                                order_id_order );
ALTER TABLE reserving
    ADD CONSTRAINT reserving_order_fk FOREIGN KEY ( order_id_order )
        REFERENCES order ( id_order );

ALTER TABLE reserving
    ADD CONSTRAINT reserving_room_fk FOREIGN KEY ( room_num_room )
        REFERENCES room ( num_room );

1 Ответ

0 голосов
/ 07 мая 2020

Я попытался воссоздать триггер с помощью приведенных выше утверждений. Утверждения не прошли с несколькими ошибками, похоже, что они не были проверены, прежде чем опубликовать их в качестве вопроса. Пожалуйста, найдите время, чтобы задать вопрос о качестве. Пример:

CREATE TABLE room (
    num_room      CHAR(100) NOT NULL,
    type          VARCHAR2(100) NOT NULL, << this trailing comma makes this statement fail.
);

После исправления всех ошибок я запустил команду «CREATE TRIGGER», и она выдала ошибку с

PLS-00049: bad bind variable 'NEW.ROOM_NUM_ROOM'

Это потому, что столбец ROOM_NUM_ROOM не существует в «ORDER» стол. Если я удалю ссылку на «NEW.ROOM_NUM_ROOM», триггер успешно компилируется.

Однако, как указал gsalem, это не сработает, потому что это вызовет ошибку изменяющейся таблицы. В коде триггера вы не можете выполнить DML, ссылаясь на таблицу, в которой находится триггер. Существует множество документации о том, как избежать ошибок мутации таблиц.

...