创建一个触发器,在从条件过滤后从其他表中复制少量数据

时间:2012-03-11 15:03:46

标签: sql oracle

我有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;

所以这个触发器是用编译错误创建的。它也不符合我的兴趣。

1 个答案:

答案 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子句中,因为不需要获取如果利息值不为零,则为这些值。

创建触发器trigger oracle documentation