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错误是什么<代码>显示错误
应列出错误。