CREATE FUNCTION check_available_flightID(date)
RETURNS integer AS
$$
BEGIN
SELECT FlightID FROM Flight WHERE FlightDate::date = $1;
IF NEW.FlightID IS NULL THEN
RAISE EXCEPTION 'No filight in the date you enter'
END IF;
RETURN query SELECT FlightID FROM Flight WHERE FlightDate::date = $1;
$$
LANGUAGE SQL;
它说“IF”附近的语法错误...
有些困惑为什么有些函数需要BEGIN
而有些函数不需要。
任何人都可以给我一个提示吗?
答案 0 :(得分:2)
在其他语法错误中,您声明它是一个SQL函数,而实际上您正在使用PL / pgSQL语法。那个:
LANGUAGE plpgsql
除语法错误外,接受的答案非常效率低下。不要使用它。 这应该做得更好(做出一些假设,因为OP拒绝合作):
CREATE FUNCTION check_available_flightid(date)
RETURNS SETOF integer AS
$func$
BEGIN
RETURN QUERY
SELECT flightid
FROM flight
WHERE flightdate >= $1
AND flightdate < ($1 + 1);
IF NOT FOUND
RAISE EXCEPTION 'No flight at %.', $1;
END IF;
END;
$func$ LANGUAGE plpgsql
不要两次运行SELECT
语句。请改用FOUND
。
从flightdate
实际上是timestamp
的情况中得出。
像FlightDate::date = $1
这样的表达式是not sargable(不能使用普通索引)。我的替代方案可以在flightdate
上使用索引并且速度会快得多,差异随着表格的大小而增长。
最终,此功能用作example in the Postgres manual.
答案 1 :(得分:2)
我不是Postgres的专家,但我认为new
适用于触发器,而不适用于常规功能。
我想你想要这样的东西:
CREATE FUNCTION check_available_flightID(date)
RETURNS integer AS
$$
declare newfid int;
BEGIN
SELECT FlightID into newfid FROM Flight WHERE FlightDate::date = $1;
IF newfid IS NULL THEN
RAISE EXCEPTION 'No flight in the date you enter';
END IF;
RETURN query SELECT FlightID FROM Flight WHERE FlightDate::date = $1;
end;
$$