因此我必须为电影租赁商店数据库编写一个触发器,该数据库会将所有租借记录到日志表中,说明谁租了什么电影以及何时租用。仅供参考,这是在sql开发人员和我使用oracle sql。
这是我的触发器:
create or replace trigger rentalLogging
after insert on rentals
for each row
declare
customerName varchar2(50);
begin
select c.name into customerName from customer c
join rentals r on c.CUST_ID = r.CUST_ID
where c.CUST_ID = :NEW.cust_id;
insert into log_movieRentals values
('customer: ' || customerName || 'rented movie on: ' || current_date);
end;
当我尝试插入我的租赁表时,我收到一个错误,表示该表正在发生变化并且触发器可能看不到它。
我需要获取客户名称并将其分配给变量的原因是因为我的租赁表不包含客户名称,而只包含客户ID,我想在这种情况下记录客户名称。
我想过创建并使用一个带有客户ID并在此触发器中返回其名称的函数,但我想知道是否有一种方法可以在此触发器中获取客户名称。
答案 0 :(得分:3)
您不需要在触发器内的查询中包含rentals
表。您需要的所有数据都已包含在new
伪记录中,实际上您不会将该表用于除之外的任何内容 - 这可能会导致查询找到多行,如果允许的话。
您可以删除联接:
select c.name into customerName from customer c
where c.CUST_ID = :NEW.cust_id;
顺便说一下,你真的不需要局部变量;你可以用以下步骤一步完成:
insert into log_movieRentals
select 'customer: ' || c.name || 'rented movie on: ' || current_date
from customer c
where c.cust_id = :new.cust_id;
最好将目标表的列名指定为表nsert语句的一部分。