Есть нехороший, но простой способ обойти это, создать вид и обновить его.Затем вы можете явно указать все столбцы в вашем триггере и поместить их в таблицу.Вам также было бы гораздо лучше создать таблицу из 1 строки с 2 столбцами, max_amount
, а затем вставлять в нее максимальную сумму и clientno
каждый раз.Вы также должны иметь столбец со скидкой в таблице покупок, так как вы должны знать, кому вы предоставили скидки.В таком случае взимается сумма amount - discount
.Это позволяет справиться как с таблицей мутаций, так и с невозможностью обновления :new.amount
, а также с намного более быстрыми запросами.В сущности, вы фактически не применяете скидку, если текущая транзакция является самой высокой, только если клиент установил предыдущее самое высокое, поэтому я написал это так.
create or replace view purchase_view as
select *
from purchase;
CREATE OR REPLACE TRIGGER TR_PURCHASE_INSERT
BEFORE INSERT ON PURCHASE_VIEW
FOR EACH ROW
DECLARE
checkclient max_amount.clientno%type;
checkamount max_amount.amount%type;
discount purchase.discount%type;
BEGIN
SELECT clientno, amount
INTO checkclient, checkamount
FROM max_amount;
IF :new.clientno = checkclient then
discount := 0.1 * :new.amount;
ELSIF :new.amount > checkamount then
update max_amount
set clientno = :new.clientno
, maxamount = :new.amount
;
END IF;
-- Don-t specify columns so it breaks if you change
-- the table and not the trigger
insert into purchase
values ( :new.clientno
, :new.amount
, discount
, :new.other_column );
END TR_PURCHASE_INSERT;
/