2017-05-03 118 views
1

我創建了這個函數,它檢查飛行的總成本是否已經被正確計算。它應該增加座位的價格,例如400乘以顧客要求的座位數目,例如2.如果客戶正確輸入總數,例如800,則應該成功返回查詢。如果他們沒有正確地輸入總數,例如1000那麼它應該引發異常'價格計算錯誤'。函數錯誤 - postgresql

CREATE FUNCTION check_totalcost() RETURNS trigger AS $check_totalcost$ 
    DECLARE seatprice int; 
    DECLARE noofseats int; 
    BEGIN 
     SELECT priceperseat INTO seatprice 
     FROM flight 
     WHERE flightid = flightid; 

     SELECT numseats INTO noofseats 
     FROM flightbooking 
     WHERE flightid = flightid; 

     IF(seatprice*noofseats != new.totalcost) THEN 
     RAISE EXCEPTION 'price has been calculated incorrectly'; 

     END IF; 
     RETURN NEW; 
    END; 
    $check_totalcost$ LANGUAGE plpgsql; 
    /* This is used to run the function above */ 
    CREATE TRIGGER insert_totalcost 
    BEFORE INSERT OR UPDATE ON flightbooking 
    FOR EACH ROW EXECUTE PROCEDURE check_totalcost(); 

當我輸入了不正確的總額,它引發異常這就是我想要的,但是當我輸入了正確的總量,這也引發了時,它應該成功返回查詢的除外。

回答

0

查詢

SELECT priceperseat INTO seatprice 
FROM flight 
WHERE flightid = flightid; 

SELECT numseats INTO noofseats 
FROM flightbooking 
WHERE flightid = flightid; 

沒有多大意義,因爲條件總是爲真。 我想你想從插入/更新的記錄中獲得flightid。使用特殊的記錄NEW

WHERE flightid = NEW.flightid; 

您的功能多了一個邏輯錯誤。座位數量也應該從new記錄中獲得。

CREATE OR REPLACE FUNCTION check_totalcost() 
RETURNS trigger AS $check_totalcost$ 
    DECLARE seatprice int; 
    BEGIN 
     SELECT priceperseat INTO seatprice 
     FROM flight 
     WHERE flightid = new.flightid; 

     IF seatprice * new.numseats != new.totalcost THEN 
      RAISE EXCEPTION 'price has been calculated incorrectly'; 

     END IF; 
     RETURN NEW; 
    END; 
    $check_totalcost$ LANGUAGE plpgsql; 
+0

當我把新的在flightid面前,我的觸發器總體不起作用。當我使用錯誤的總成本插入飛行記錄時,它會插入 –

+0

查看更新後的答案。 – klin

+0

非常感謝,這工作,並非常有幫助。 –