Предупреждение: скомпилировано, но с ошибками компиляции при создании триггера в pl / sql? - PullRequest
0 голосов
/ 03 мая 2018

Таблица моего проекта.

create table book_rec(book_name char(30),author char(30),total_copies number(15),available_copies number(5),primary key(book_name));
create table membership_rec(mem_id number(20),mem_name char(30),no_of_books_taken number(4),primary key(mem_id));
create table book_details(book_id number(30),book_name char(30),mem_id number(5),primary key(book_id),foreign key(book_name)references book_rec(book_name));
create table circulation_rec(book_id number(20),mem_id number(20),issue_date date,return_date date,foreign key (book_id)references book_details(book_id),foreign key(mem_id)references membership_rec(mem_id));

Я хочу создать триггер, чтобы автоматически увеличивать и уменьшать no_of_books_taken из book_rec при выпуске date_date и return_date, основываясь на записи обращение_c. Но программа показывает ошибку. Как я могу устранить ошибку. Можете ли вы помочь кому-нибудь?

Это мой код для триггера.

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 = :NEW.book_name;
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 = :old.book_name;
update membership_rec
set no_of_books_taken = no_of_books_taken - 1
where mem_id = :New.mem_id;
end if;
end;
/

1 Ответ

0 голосов
/ 03 мая 2018

Если вы выполните 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 демо

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