Создадим таблицы:
create table KK_RATE
(
rate_date DATE,
currency_code INTEGER,
rate NUMBER(6,2)
);
insert into KK_RATE(RATE_DATE, CURRENCY_CODE, RATE) values(to_date('22.03.2012','dd.mm.yyyy'), 840, 29.43);
insert into KK_RATE(RATE_DATE, CURRENCY_CODE, RATE) values(to_date('23.03.2012','dd.mm.yyyy'), 840, 29.35);
insert into KK_RATE(RATE_DATE, CURRENCY_CODE, RATE) values(to_date('22.03.2012','dd.mm.yyyy'), 978, 38.42);
insert into KK_RATE(RATE_DATE, CURRENCY_CODE, RATE) values(to_date('23.03.2012','dd.mm.yyyy'), 978, 38.45);
create table KK_PAYMENT
(
payment_date DATE,
currency_code INTEGER,
payment_sum_in_currency NUMBER(6,2),
payment_sum_in_rub NUMBER(6,2)
);
Создадим решающий задачу триггер:
CREATE OR REPLACE TRIGGER KK_TRIG_BIU_KK_PAYMENT
BEFORE INSERT OR UPDATE ON KK_PAYMENT
FOR EACH ROW
DECLARE
V_RATE KK_RATE.RATE%TYPE;
BEGIN
BEGIN
SELECT RATE
INTO V_RATE
FROM KK_RATE
WHERE KK_RATE.CURRENCY_CODE = :NEW.CURRENCY_CODE
AND KK_RATE.RATE_DATE = :NEW.PAYMENT_DATE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('RATE NOT FOUND');
END;
:NEW.PAYMENT_SUM_IN_RUB := V_RATE * :NEW.PAYMENT_SUM_IN_CURRENCY;
END KK_TRIG_BIU_KK_PAYMENT;
Осуществим проверочные вставки, указываем 3 поля, 4ое рассчитывается триггером:
INSERT INTO KK_PAYMENT(PAYMENT_DATE, CURRENCY_CODE, PAYMENT_SUM_IN_CURRENCY) VALUES(TO_DATE('22.03.2012', 'DD.MM.YYYY'), 840, 100);
INSERT INTO KK_PAYMENT(PAYMENT_DATE, CURRENCY_CODE, PAYMENT_SUM_IN_CURRENCY) VALUES(TO_DATE('23.03.2012', 'DD.MM.YYYY'), 978, 100);
INSERT INTO KK_PAYMENT(PAYMENT_DATE, CURRENCY_CODE, PAYMENT_SUM_IN_CURRENCY) VALUES(TO_DATE('30.10.1980', 'DD.MM.YYYY'), 840, 2);
Смотрим результат (в т. ч. DBMS_OUTPUT после каждой вставки):
SELECT * FROM KK_PAYMENT;
Сделаем update:
UPDATE KK_PAYMENT
SET PAYMENT_SUM_IN_CURRENCY = 200
WHERE PAYMENT_DATE = TO_DATE('23.03.2012', 'DD.MM.YYYY')
AND CURRENCY_CODE = 978
AND PAYMENT_SUM_IN_CURRENCY = 100;
Смотрим результат:
SELECT * FROM KK_PAYMENT;