我有5张桌子。他们是---
create table customer
(
cust_name varchar2(20),
cust_id number(5),
date_of_birth date
)
insert into customer values('Mark',1,'10-JAN-1984');
insert into customer values('Sam',2,'22-FEB-1990');
create table bank
(
bank_name varchar2(20),
bank_id number(5)
)
insert into bank values(20,'HDFC');
insert into bank values(42,'ICICI');
create table location
(
bank_id number(5),
loc_name varchar2(20)
)
insert into location values(30,'Delhi');
insert into location values(30,'USA');
create table loan
(
cust_id number(5),
bank_id number(5),
st_date date
intrest number(5)
)
create table audit
(
cust_id number(5),
cust_name varchar2(20),
date_of_birth date,
bank_name varchar2(20),
st_date date,
loc_name varchar2(20),
interest number(5)
)
我想在贷款表上创建一个触发器,如果任何客户获得0利息,那么该客户及其银行的详细信息必须存储在审计表中。
所以如果执行此代码 -
insert into loan values(1,20,'20-DEC-2011',0);
这意味着该客户的利息为0,因此他的记录和银行记录必须存储在审计表中。
我的触发器代码是 -
create or replace trigger trg_loan
after insert or update
on loan
for each row
declare
var_loc varchar2(50);
var_name varchar2(50);
var_bankname varchar2(50);
begin
select cust_name into var_name from customer where cust_id = :new.cust_id;
select bank_name into var_bankname from bank where bank_id = :new.bank_id;
select loc_name into var_loc from location where loc_id = :new.loc_id;
IF (:new.interest = 0) THEN
insert into audit
values(:new.cust_id,var_name,:new.date_of_birth,var_bankname,:new.st_date,var_loc,:new.interest);
END IF;
end;
所以这个触发器是用编译错误创建的。它也不符合我的兴趣。
答案 0 :(得分:2)
首先要理解这个逻辑,如果你在触发器中引用:new.[variable_name]
,那么应该始终引用应用了触发器的表的那些列。
对于例如:在您的情况下触发器应用于loan
表,因此cust_id number(5),
bank_id number(5),
st_date date
intrest number(5)
仅与:new
关键字一起使用。
其次,在创建触发器时会发现以下错误。
TRIGGER SCOTT.TRG_LOAN的编译错误
错误:PLS-00049 :错误的绑定变量'NEW.INTEREST' 行:12 文字:IF(:new.interest = 0)那么
原因:您已使用该脚本创建列名为intrest not interest
的表,请更改要感兴趣的表名。
错误:PLS-00049 :错误的绑定变量'NEW.LOC_ID' 行:15 文本:从loc_id =:new.loc_id;
的位置选择loc_name到var_loc 原因:您无法在此触发器中引用:new.loc_id
,因为这不是loc
表格列的一部分。
错误:PLS-00049:错误的绑定变量'NEW.DATE_OF_BIRTH' 行:17 文本:values(:new.cust_id,var_name,:new.date_of_birth,var_bankname,:new.st_date,var_loc,:new.interest);
原因:同样,date_of_birth不是loc表的列,在您的情况下从客户表中获取数据,如
select cust_name,date_of_birth into var_name,var_dob from customer where cust_id = :new.cust_id;
然后在插入var_dob
表时使用此audit
变量
错误:PLS-00049:错误的绑定变量'NEW.INTEREST' 行:17 文本:values(:new.cust_id,var_name,:new.date_of_birth,var_bankname,:new.st_date,var_loc,:new.interest);
原因:与上述相同。
建议:如果您只想在0
兴趣值的情况下将数据插入到审计表中,那么将所有select语句放在if子句中,因为不需要获取如果利息值不为零,则为这些值。