首页 > 解决方案 > 在进行存款后插入触发器以更新帐户余额

问题描述

我有两张桌子。一个是关于账户的信息,另一个是关于新存款的信息。我想在存款表中进行存款后编写一个触发器来更新账户表中的余额。有人可以告诉我我写的代码有什么问题吗?我是 sql 新手并尝试学习。提前致谢!

create table account( 
account_number number(8) not null,  
register_date date not null, 
balance number(10,2)

constraint account_pk primary key(account_number)
);

create table deposit( 
row_nr number(9) not null,  
account_number number(8) not null, 
amount number(10,2), 
deposit_date date not null, 

constraint deposit_pk primary key(row_nr),  
constraint deposit_fk foreign key(row_nr) references account(row_nr) 
);

create or replace trigger aifer_deposit
after insert
on deposit
for each row 
begin
update account
set balance = balance + (select amount from deposit)
where account.account_number = deposit.account_number;
end;

标签: plsqltriggers

解决方案


您没有列出您遇到的错误或任何其他可以提供准确帮助的信息……但是,我发现的两件事都与

select amount from deposit

1) 这将从 deposit 中选择所有行,因为您没有指定 where 子句。这将返回在此上下文中不起作用的多行

2)您在触发器处于存款状态时从存款中选择,这可能会导致变异表错误,因此应不惜一切代价避免。

首先查看https://www.techonthenet.com/oracle/triggers/after_insert.php上的示例

这表明您可以使用 :new.amount (:new 引用刚刚插入的行) 而不是进行选择,因此您的更新看起来更像

update account
set balance = balance + :new.amount
where account.account_number = :new.account_number;

如果还有其他错误,请发布有关您收到的错误的更具体信息。


推荐阅读