Таблицы мутаций Oracle - PullRequest
0 голосов
/ 10 мая 2018

У меня есть эта процедура, которая вычисляет общую сумму, заплаченную за автомобиль, и определяет, можно ли изменить статус автомобиля на «ПРОДАНО», если сумма равна цене.

Я знаю, что проблема в запросе car_payment, но я не могу найти другой способ сделать сумму, кто-нибудь может мне помочь, пожалуйста?

create or replace trigger tr_paid_car
    before insert
    or update of amount
    on car_payment
    for each row

declare 
    v_amount number;
    v_car_status_id car_status.car_status_id%type;
    v_price car.price%type;
begin
    select sum(amount)
        into v_amount
        from car_payment
        where car_id = :new.car_id;

    if inserting then 
        v_amount := v_amount + :new.amount;
    elsif updating then
        v_amount := v_amount + :new.amount - :old.amount;
    end if;

    select price
        into v_price
        from car
        where car_id = :new.car_id;

    if v_amount >= v_price then
        select car_status_id
        into v_car_status_id
        from car_status
        where description = 'SOLD';

        update car
            set car_status_id = v_car_status_id
            where car_id = :new.car_id;
    end if;
end;

/

1 Ответ

0 голосов
/ 10 мая 2018

Создайте еще одну функцию с именем: GET_CAR_PAY_AMT, как показано ниже.

CREATE OR REPLACE FUNCTION GET_CAR_PAY_AMT(p_car_id car_payment.car_id%type) return number
as
pragma autonomous_transaction;
x number;
begin
select sum(amount)
        into x
        from car_payment
        where car_id = p_car_id;
return x;
end GET_CAR_PAY_AMT;

Теперь используйте функцию GET_CAR_PAY_AMT вместо оператора SELECT в триггере, как показано ниже:

Заменить ниже SQL:

select sum(amount)
into v_amount
from car_payment
where car_id = :new.car_id;

С:

v_amount := GET_CAR_PAY_AMT(:new.car_id);
...