Если вы выполните SHOW ERRORS
или выполните этот запрос,
SELECT NAME, TYPE, line, text FROM user_errors;
Вы узнаете полное сообщение об ошибке
NAME, TYPE LINE TEXT
---- --- --- ----
T_TRIGGER TRIGGER 6 PLS-00049: bad bind variable 'NEW.BOOK_NAME'
T_TRIGGER TRIGGER 13 PLS-00049: bad bind variable 'OLD.BOOK_NAME'
Теперь эта ошибка вызвана тем, что владелец таблицы Trigger - circulation_rec
не имеет book_name
столбцов. Итак, Oracle не понимает, что означают :NEW.book_name
и :OLD.book_name
в этом контексте, и поэтому выдает ошибка переменной связывания.
Теперь, чтобы исправить это, вы можете добавить условие IN
, чтобы получить book_id
из таблицы book_details
, потому что circulation_rec
имеет book_id
.
Как то так.
CREATE OR replace TRIGGER t_trigger
AFTER INSERT OR UPDATE ON circulation_rec
FOR EACH ROW
BEGIN
IF inserting THEN
UPDATE book_rec
SET available_copies = available_copies - 1
WHERE book_name IN (SELECT book_name
FROM book_details
WHERE book_id = :NEW.book_id);
UPDATE membership_rec
SET no_of_books_taken = no_of_books_taken + 1
WHERE mem_id = :NEW.mem_id;
ELSIF updating THEN
UPDATE book_rec
SET available_copies = available_copies - 1
WHERE book_name IN (SELECT book_name
FROM book_details
WHERE book_id = :OLD.book_id);
UPDATE membership_rec
SET no_of_books_taken = no_of_books_taken - 1
WHERE mem_id = :New.mem_id;
END IF;
END;
/
Вот dbfiddle демо