我有 5 张 table 。他们是——
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;
所以这个触发器是在编译错误的情况下创建的。它也不符合我的兴趣。
最佳答案
首先要理解这个逻辑,如果你指的是
: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:错误的绑定(bind)变量“NEW.INTEREST” 线路:12 文本:IF (:new.interest = 0) THEN
原因:您使用了创建列名为
intrest not interest
的表的脚本,请将表名更改为感兴趣的。错误:PLS-00049:错误的绑定(bind)变量“NEW.LOC_ID” 线路:15 文本:从 loc_id = :new.loc_id; 的位置选择 loc_name into var_loc;
原因:您无法引用
:new.loc_id
在此触发器中,因为这不是loc
的一部分表格列。错误:PLS-00049:错误的绑定(bind)变量“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:错误的绑定(bind)变量“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
关于sql - 创建一个触发器,在从条件过滤后从其他表复制少量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656059/