编写PL / pgSQL函数,以便在找到“nothing”时不设置FOUND?

时间:2012-06-20 19:37:36

标签: sql function postgresql stored-procedures plpgsql

我刚刚开始使用PostgreSQL中的函数,这可能是非常基本的,但这是如何完成的?

我希望能够在函数中使用以下内容:

PERFORM id_exists();
IF FOUND THEN
   -- Do something
END IF;

其中id_exists()函数(与SELECT和PERFORM一起使用)是:

CREATE OR REPLACE FUNCTION id_exists() RETURNS int AS $$
DECLARE
  my_id int;
BEGIN
  SELECT id INTO my_id
  FROM tablename LIMIT 1;
  RETURN my_id;
END;
$$ LANGUAGE plpgsql;

目前,即使表中不存在my_idFOUND也是如此,可能是因为仍然返回一行(空整数)?如何重写这样,如果找到则返回一个整数,否则什么都没有?

1 个答案:

答案 0 :(得分:1)

您的假设是正确的,如果最后一个语句返回一行,FOUND设置为TRUE,无论值如何(在您的情况下可能为NULL)。手册中的详细信息here

重写为,例如:

IF id_exists() IS NOT NULL THEN
   -- Do something
END IF;

使用 SETOF 重写功能的返回值,以便它可以返回多行 - 或无行!像我演示一样使用RETURN QUERY。您可以在原始设置中使用此功能。

CREATE OR REPLACE FUNCTION id_exists()
  RETURNS SETOF int LANGUAGE plpgsql AS
$BODY$
BEGIN
  RETURN QUERY
  SELECT id
  FROM   tablename
  LIMIT  1;
END;
$BODY$;

,使用语言SQL 功能更简单:

CREATE OR REPLACE FUNCTION id_exists()
  RETURNS SETOF int LANGUAGE sql AS
$BODY$
  SELECT id
  FROM   tablename
  LIMIT  1;
$BODY$;