函数错误 - postgresql

问题描述:

我创建了这个函数,它检查飞行的总成本是否已经被正确计算。它应该增加座位的价格,例如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(); 

当我输入了不正确的总额,它引发异常这就是我想要的,但是当我输入了正确的总量,这也引发了时,它应该成功返回查询的除外。

查询

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

非常感谢,这工作,并非常有帮助。 –