2016-11-25 72 views
1

我们试图根据它租用的天数来计算出租车的TOTAL_COST的触发器。租赁总成本是根据车辆的天数和成本计算的。总额增加12%的附加税。如果租金超过10天,则从总费用中扣除15%的折扣。SQL触发器更新始终为空

这是我们的触发器:

create or replace trigger L5_Q8 
    After Update on E2_RESERVATIONS 
    for each row 
    Declare 
    TOTALDAYS NUMBER(4); 
    TotalCostBeforeTax Number(8); 
    BEGIN 
    TOTALDAYS := (trunc(:NEW.END_DATE) - TRUNC(:NEW.START_DATE)) + 1; 
    IF(TOTALDAYS > 10) THEN 
     SELECT V.COST_PER_DAY * TOTALDAYS * 0.85 
     INTO TotalCostBeforeTax 
     from E2_Reservations R 
     join E2_Vehicle V on R.V_ID = V.V_ID; 
    END IF; 
    IF(TOTALDAYS <= 10) THEN 
     SELECT V.COST_PER_DAY * TOTALDAYS 
     INTO TotalCostBeforeTax 
     from E2_Reservations R 
     join E2_Vehicle V on R.V_ID = V.V_ID; 
    END IF; 
     TotalCostBeforeTax := TotalCostBeforeTax * 1.12; 
     UPDATE E2_RESERVATIONS SET TOTAL_COST = 10.1 WHERE ROWID IN (SELECT MAX(ROWID) FROM E2_RESERVATIONS); 
    END; 

这些都是我们的表:

E2_RESERVATIONS:

E2_RESERVATIONS Table

E2_VEHICLE:

Vehicle Table

+0

注意:'TotalCostBeforeTax'必须声明为'Number(8,2)'... –

回答

1

您正在尝试计算当前记录的总费用,对不对?因此,在之前的计算应用更改,而不是在after update触发器中。另外,这个触发器中有太多的SQL。

试试这个:

create or replace trigger l5_q8 
    before update on e2_reservations 
    for each row 
declare 
    totaldays number(4); 
    totalcostbeforetax number(8,2); 
begin 
    -- length of reservation 
    totaldays := (trunc(:new.end_date) - trunc(:new.start_date)) + 1; 

    -- base cost of hire 
    select v.cost_per_day * totaldays 
    into totalcostbeforetax 
    from e2_vehicle v 
    where v.v_id = :new.v_id; 

    -- apply discount for long reservation 
    if(totaldays > 10) then 
     totalcostbeforetax := totalcostbeforetax * 0.85; 
    end if; 

    -- apply tax to total cost 
    :new.total_cost := totalcostbeforetax * 1.12; 
end; 

注意这是一个BEFORE UPDATE触发器,而不是之后更新。

此外,变量totalcostbeforetax需要处理小数,因为您乘以0.85,并且无论如何都应该匹配列total_cost的声明。


“难道你需要加入车辆表预订了吗?”

触发器可以访问构建它的触发器的所有列。所以你已经加入了保留表,由where v.v_id = :new.v_id,这是当前保留记录的车辆ID。

+0

您是否需要加入车辆表中的预订? 随着你的解决方案,它给了我们一个新的错误 错误(13,5):PLS-00049:坏绑定变量'NEW' 我们试着改变最后几行以消除新的错误,编译但仍然返回空值 – bad22

+0

除了这次在new.totalcost元素上,我们得到了相同的错误。 是否有另一种方法来更新表后的所有计算? – bad22

+0

@ bad22你知道你需要更新的列,为什么你不能自己更正:new.totalcost标识符名称?看起来也许它缺少一个下划线? – Boneist