plsql - 在进行存款后插入触发器以更新帐户余额
问题描述
我有两张桌子。一个是关于账户的信息,另一个是关于新存款的信息。我想在存款表中进行存款后编写一个触发器来更新账户表中的余额。有人可以告诉我我写的代码有什么问题吗?我是 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) 这将从 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;
如果还有其他错误,请发布有关您收到的错误的更具体信息。
推荐阅读
- c++ - 具有动态选择的 C++ 模板类型
- java - 如何使用单独的方法隐藏 JButton 并在新类中调用
- c++ - C++ 静态库
- spring-boot - Spring Reactive kafka Receiver 总是将引导服务器覆盖到 localhost
- android - 为什么将 Dagger 与 Android 架构组件一起使用
- sas - 如何在 SAS 中重用哈希表
- python - 如何防止Python中的线程中断
- java - 在 Android Java 中定义字符串常量
- sql - SQL:加入时的级联条件
- c# - 在具有 2 个不同 .SVC 文件的多线程环境中调用 WCF 服务。同时调用两个服务时出错