Oracle SQL 编写转账表插入后更新账户余额触发器报错求解
Oracle 转账触发器具修正方案
原代码错误原因
- 绑定变量语法错误:错误书写为
:new:account_num,多了一个冒号,正确绑定变量格式为:new.字段名 - 非法引用旧行变量:INSERT触发器仅存在
:new新行绑定变量,不存在:old旧行变量,引用:old会直接触发绑定变量不存在报错 - 业务逻辑完全不符合需求:转账业务需要分别操作转出、转入两个账户的余额,原逻辑用转入账号和客户号比对的判断逻辑完全错误
- 关联条件错误:原更新账户表的where条件没有关联转账表的转出/转入账号字段,无法定位到需要更新的账户记录
正确实现代码
create or replace trigger aifer_transfer after insert on transfers for each row -- 仅当转账金额不为空且为正数时触发 when (new.amount is not null and new.amount > 0) begin -- 转出账户扣减对应金额 update account set balance = balance - :new.amount where account_num = :new.from_account_num; -- 转入账户增加对应金额 update account set balance = balance + :new.amount where account_num = :new.to_account_num; end; /
可选优化点
- 若需要校验转出账户余额充足,可以在两个update语句前增加余额校验逻辑,余额不足时抛出自定义异常中断转账操作
- 可新增对转出、转入账号是否存在的校验,避免无效转账记录插入
内容的提问来源于stack exchange,提问作者Baibs
相关产品推荐
相关产品推荐

