【问题标题】:Write a PL/pgSQL function so that FOUND is not set when "nothing" is found?编写一个 PL/pgSQL 函数,以便在找到“无”时不设置 FOUND?
【发布时间】:2012-06-20 19:37:36
【问题描述】:

我刚刚开始使用 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_id 不存在于表中,FOUND 也为真,大概是因为仍在返回一行(一个空整数)?如何重写,以便找到一个整数返回,否则什么都没有?

【问题讨论】:

    标签: sql function postgresql stored-procedures plpgsql


    【解决方案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$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多