Я пытаюсь создать триггер TrgDisAmount
для чтения PROD_NAME
и PRICE
из таблицы PRODUCT
и для вычисления DISCOUNT
и AMOUNT
таблицы SALES
для каждой новой вставленной строки со значениями SERIAL
и PCODE
.
Это информация о таблицах
Table SALES (SERIAL, PCODE, PROD_NAME, PRICE, DISCOUNT, AMOUNT)
Table PRODUCT (PCODE, PROD_NAME, PROD_CAT, PRICE)
Table DISCOUNT (PROD_CAT, DISCOUNT_RATE)
Примечание.
- Введите значения только для
SERIAL
иPCODE
, остальные столбцы должны вводиться только триггеромTrgDisAmount
- Получите
DISCOUNT_RATE
с помощью функцииGetDiscount
.
Я уже создал функцию GetDiscount
для получения DISCOUNT_RATE
из таблицы DISCOUNT
.
Это моя попытка:
create or replace trigger TrgDisAmount
before insert on SALES for each row
begin
if :new.PCODE = :old.PRODUCT.PCODE then
:new.PROD_NAME := :old.PRODUCT.PROD_NAME;
:new.PRICE := :old.PRODUCT.PRICE;
:new.DISCOUNT := :old.product.PRICE / (GetDiscount(:old.PRODUCT.PROD_CAT));
:new.AMOUNT := :new.PRICE - :new.DISCOUNT;
end if;
insert into SALES columns (PROD_NAME, PRICE, DISCOUNT, AMOUNT)
values (:new.PROD_NAME, :new.PRICE, :new.DISCOUNT, :new.AMOUNT);
end;
/
Когда я запускаю этот блок, он показывает мне эту ошибку:
PLS-00049: bad bind variable 'OLD.PRODUCT'
Я использую Table_Name.Column_name
для доступа к определенному столбцу. Законно ли это делать?
Пример вывода должен быть таким:
SQL> insert into sales values (1,'MB-101',null, null, null, null);
Result in SALES table:
SERIAL : 1,
PCODE : MB-101,
PROD_NAME : IPHONE 6+,
PRICE : 250 ,
DISCOUNT : 25,
AMOUNT : 225