2016-11-25 113 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