【问题标题】:FUNCTION syntax errorFUNCTION 语法错误
【发布时间】:2021-07-04 06:08:57
【问题描述】:
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 而有些不需要。

谁能给我一个提示?

【问题讨论】:

  • 这应该是触发功能吗?如果是,请提供触发器创建脚本、一些解释和涉及的表的表定义。请澄清。

标签: sql function postgresql plpgsql postgresql-9.1


【解决方案1】:

我不是 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;
$$

【讨论】:

  • @johnnily:那是因为在 raise 语句之后缺少 ;。这里有更多的语法错误。但猜谜游戏毫无意义。请编辑您的问题并按要求提供更多信息。
  • @johnnily 。 . .我只是在语句的末尾添加了一个分号,我认为这在 Postgres 中是必要的。
【解决方案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
    FlightDate::date = $1 这样的表达式是not sargable(不能使用普通索引)。我的替代方案可以使用flightdate 上的索引,并且速度会快得多。差异随着表格的大小而增大。

这个函数后来被添加为example in the manual.

【讨论】:

  • 你的 PostgreSQL 版本是多少?
  • @Pavel:只有我被告知您的评论。另外,johnnily 的评论是在我添加更多内容之前。
  • @Erwin:只是一个小注释——这是我个人的看法——每个非 void 函数都应该由 RETURN 语句完成。它现在是可选的,但我认为它增加了可读性(并且 RETURN 具有 +/- 零开销)。否则,您的代码就是很好的例子,为什么 RETURN QUERY 不应该完成执行(这是一个很好的技巧)。当我们设计这个语句时,我们谈到了行为,一种可能性是不同的行为。我读了一篇 PostgreSQL 文档,但没有很好的 RETURN QUERY 示例 - 您可以将此示例作为文档补丁发送吗?
  • @PavelStehule:我向 pgsql-docs@postgresql.org 发送了一封邮件,标题为 Code examples for 39.6.1. Returning From a Function(包括另一个修复),参考了这个页面。现在 Peter Eisentraut 想知道如何处理它。可以看看吗?
  • 我向邮件列表发送了一个补丁
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2021-03-10
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多