Plsql 在执行存款后插入更新帐户余额的触发器

Plsql 在执行存款后插入更新帐户余额的触发器,plsql,triggers,Plsql,Triggers,我有两张桌子。一个是关于账户的信息,另一个是关于新存款的信息。我想写一个触发器,在存款表中存款后更新帐户表中的余额。有人能告诉我我写的代码有什么问题吗?我是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_nu

我有两张桌子。一个是关于账户的信息,另一个是关于新存款的信息。我想写一个触发器,在存款表中存款后更新帐户表中的余额。有人能告诉我我写的代码有什么问题吗?我是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;

您没有列出您正在获得的错误或任何其他信息,以便提供准确的帮助。。。。然而,这两件事都与我有关

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

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

首先看一下下面的示例:

这表明您可以使用:new.amount(:new引用刚刚插入的行),而不是执行select,这样更新看起来更像

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

如果有进一步的错误,请发布有关您收到的错误的详细信息。

谢谢@Shaunt问题正如您所解释的。