功能语法错误

时间:2013-03-31 15:50:47

标签: sql function postgresql plpgsql postgresql-9.1

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而有些函数不需要。

任何人都可以给我一个提示吗?

2 个答案:

答案 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;
$$