Oracle 警告:在pl/sql中创建触发器时已编译,但在中有编译错误?

Oracle 警告:在pl/sql中创建触发器时已编译,但在中有编译错误?,oracle,plsql,Oracle,Plsql,我的项目表是 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_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));
我想创建一个触发器,在发行日期和基于发行记录返回日期时自动增加和减少从图书记录中获取的图书数量。但是程序显示了错误。我如何解决错误。你能帮助任何人吗

这是我的触发器代码

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

如果您确实显示错误或运行此查询

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'
现在,导致此错误的原因是触发器-
circulation\u rec
表的所有者没有
book\u name
列。因此,Oracle不理解
:NEW.book\u name
:OLD.book\u name
在此上下文中的含义,因此它抛出了错误的绑定变量错误

现在,为了解决这个问题,您可以在条件中添加一个
,从
book\u details
表中获取
book\u id
,因为
circulation\u rec
确实有
book\u 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; 

/ 

这是一个DBFIDLE

错误是什么<代码>显示错误
应列出错误。