После вставки триггера для обновления баланса счета после внесения депозита - PullRequest
0 голосов
/ 12 марта 2020

У меня есть две таблицы. Один - это информация о счете, а другой - информация о новых депозитах. Я хочу написать триггер обновления баланса в таблице счетов после внесения депозита в таблицу депозитов. Может кто-нибудь, пожалуйста, скажите мне, что не так с кодом, который я написал? Я новичок в 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;

1 Ответ

0 голосов
/ 12 марта 2020

Вы не перечисляете, какие ошибки вы получаете, или какую-либо другую информацию, которая позволила бы получить точную помощь .... Однако две вещи, которые меня выделяют, связаны с

select amount from deposit

1) Это выберет ВСЕ строки из депозита, так как вы не указали условие where. Это вернет несколько строк, которые не будут работать в этом контексте

2) Вы выбираете из депозита, когда триггер находится на депозите, это может привести к ошибкам изменяющейся таблицы, поэтому следует избегать любой ценой.

Начните с просмотра примеров на https://www.techonthenet.com/oracle/triggers/after_insert.php

. Это показывает, что вы можете использовать вместо этого: new.amount (: новые ссылки на только что вставленную строку) сделать выбор, чтобы ваше обновление выглядело больше как

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

Если есть дальнейшие ошибки, пожалуйста, опишите больше c информации об ошибке, которую вы получаете.

...