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

谁能给我一个提示?

4

2 回答 2

2

在其他语法错误中,您将它声明为 SQL 函数,而实际上它是 PL/pgSQL 语法。做那个LANGUAGE plpgsql

适当的功能

当前接受的答案非常低效。不要使用它。这应该做得更好(基于OP模糊的假设):

CREATE FUNCTION check_available_flightid(date)
  RETURNS SETOF integer
  LANGUAGE plpgsql 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$
  • 不要运行该SELECT语句两次。改为使用FOUND
  • flightdate似乎是timestamp
    表达式 likeFlightDate::date = $1不可分割的(不能使用普通索引)。我的替代方案可以使用索引,flightdate并且会更快。差异随着表的大小而增长。

该功能后来作为示例添加到手册中。

于 2013-03-31T16:07:03.180 回答
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;
$$
于 2013-03-31T16:07:45.217 回答