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

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

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

CREATE TRIGGER check_rezervace 
  BEFORE INSERT ON rezervuje 
  FOR EACH ROW 
DECLARE 
    chyba INTEGER; 
BEGIN 
    SELECT Count(*) 
    INTO   chyba 
    FROM   rezervuje 
           join (SELECT rezervace_od 
                 INTO   new_od 
                 FROM   objednavka 
                 WHERE  id_objednavky = :new.objednavka_id_objednavky) 
             ON objednavka.id_objednavky = rezervuje.objednavka_id_objednavky 
           join (SELECT rezervace_do 
                 INTO   new_do 
                 FROM   objednavka 
                 WHERE  id_objednavky = :new.objednavka_id_objednavky) 
             ON objednavka.id_objednavky = rezervuje.objednavka_id_objednavky 
    WHERE  rezervuje.pokoj_cislo_pokoje = :new.pokoj_cislo_pokoje 
           AND ( objednavka.rezervace_od < :new.new_od 
                 AND :new.new_od < objednavka.rezervace_do ) 
            OR ( objednavka.rezervace_od < :new.new_od 
                 AND :new.new_do < objednavka.rezervace_do ) 
            OR ( :new.new_od <= objednavka.rezervace_od 
                 AND objednavka.rezervace_do <= :new.new_do ); 

    IF chyba > 0 THEN 
      Raise_application_error(-20001, 'rezervace již existuje'); 
    END IF; 
END; 

У меня ошибка компилятора проверки:

Trigger CHECK_REZERVACE compiled

LINE/COL  ERROR
--------- -------------------------------------------------------------
3/3       PL/SQL: SQL Statement ignored
4/24      PL/SQL: ORA-01744: ???????????? INTO
9/35      PLS-00049: ???????? ?????????? ???????? 'NEW.NEW_OD'
9/51      PLS-00049: ???????? ?????????? ???????? 'NEW.NEW_OD'
10/35     PLS-00049: ???????? ?????????? ???????? 'NEW.NEW_OD'
10/51     PLS-00049: ???????? ?????????? ???????? 'NEW.NEW_DO'
11/9      PLS-00049: ???????? ?????????? ???????? 'NEW.NEW_OD'
11/79     PLS-00049: ???????? ?????????? ???????? 'NEW.NEW_DO'
Errors: check compiler log

Как исправить? Этот триггер не позволяет добавлять резервирование (reservace_od / reservace_do) в комнату, если бронирование уже существовало на эту дату.

1 Ответ

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

В вашем коде много ошибок. Я пытался исправить эти ошибки. Вы можете попробовать следующий код -

CREATE TRIGGER check_rezervace 
  AFTER INSERT ON rezervuje 
DECLARE 
    chyba INTEGER; 
BEGIN 
    SELECT Count(*) 
    INTO   chyba 
    FROM   rezervuje 
    join objednavka ON objednavka.id_objednavky = rezervuje.objednavka_id_objednavky 
    WHERE ( objednavka.rezervace_od < rezervace_od
                 AND rezervace_od < objednavka.rezervace_do ) 
            OR ( objednavka.rezervace_od < rezervace_od
                 AND rezervace_do < objednavka.rezervace_do ) 
            OR ( rezervace_od <= objednavka.rezervace_od 
                 AND objednavka.rezervace_do <= rezervace_do ); 

    IF chyba > 0 THEN 
      Raise_application_error(-20001, 'rezervace již existuje'); 
    END IF; 
END; 

Изначально у вас есть предложение INTO в ваших операторах JOIN, которое было неверным, также вы не можете запустить select в той же таблице, которая обновляется. это полностью изменит ошибку таблицы. Итак, я преобразовал ваш триггер в триггер после оператора.

Я не уверен, что этот триггер будет работать или нет, так как у нас нет образцов данных в таблицах rezervuje и objednavka. Для получения более подробной информации предоставьте образцы данных в этих таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...