【发布时间】:2021-05-18 08:03:29
【问题描述】:
有人可以帮我吗?我正在尝试创建一个触发器,在 TRANSFERS 表中的事务之后更新 ACCOUNT 表中的余额。整个表模型更大,但这里有两个:
--ACCOUNT--
CREATE TABLE account(
account_num NUMBER(8) NOT NULL PRIMARY KEY,
ktnr REFERENCES account_type(ktnr),
regdate DATE NOT NULL,
balance NUMBER(10,2));
--TRANSFERS--
CREATE TABLE transfers(
row_nr NUMBER(9) NOT NULL PRIMARY KEY,
pers_nr REFERENCES customer(pers_nr),
from_account_num REFERENCES account(account_num),
to_account_num REFERENCES account(account_num),
amount NUMBER(10,2),
date DATE NOT NULL);
而且我认为代码是完全错误的,但这就是解决方案的想法。不知道如何写得更好。
create or replace trigger aifer_transfers
after insert
on transfers
for each row
when (new.amount is not null)
begin
if :new.to_account_num != :new.pers_nr then
update account a
set a.balance = a.balance - :new.amount
where :old.account_num = :new:account_num;
elsif
:new.to_account_num = :new.pers_nr then
update account a
set a.balance = a.balance + :new.amount
where :old.account_num = :new:account_num;
end if;
end;
许多不同的错误,取决于选择的变量: 行/列:3/9 PL/SQL:忽略 SQL 语句 行/列:5/26 PLS-00049:错误的绑定变量“新”
【问题讨论】:
-
抱歉,我的代码在翻译成英文时出现了一些错误。我编辑了它,应该更有意义。
-
:new:account_num应该是:new.account_num。这不是语法错误,但我无法想象您希望您的where子句比较account_num的:old和:new值。我敢打赌,您希望where子句为a.account_num = :new.account_num。我看不出您的if语句在逻辑上的意义——为什么引用account表的to_account_num会匹配引用customer表的pers_nr列? -
在
insert声明:old总是empty。 -
@JustinCave
transfers表没有account_num列。 -
@Baibs 正如我在之前的评论中所说的那样;
transfers表没有account_num表,因此使用:NEW.account_num将不起作用(您会得到PLS-00049异常)。您只能使用:NEW绑定变量引用已插入的表的列(即transfers)。