0

我有一个简单的函数,需要从 select 语句中返回一个整数。就是这个:

CREATE OR REPLACE FUNCTION validate(_identityid integer, _postid integer) RETURNS integer
    LANGUAGE plpgsql
AS
$$
BEGIN
    SELECT postid
    FROM post 
    WHERE
            postid = _postid
      AND
            identityid = _identityid;
END;
$$;

如果我运行上述函数,我会收到以下错误:

[42601] 错误:查询没有结果数据的目的地 提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。

为什么结果数据没有目的地?为什么它不只返回SELECT语句?

4

2 回答 2

2

如手册中所述,查询结果需要存储在某处。

CREATE OR REPLACE FUNCTION validate(_identityid integer, _postid integer) RETURNS integer
    LANGUAGE plpgsql
AS
$$
DECLARE
  l_result integer;
BEGIN
    SELECT postid
      into l_result
    FROM post 
    WHERE
            postid = _postid
      AND
            identityid = _identityid;
  return l_result;
END;
$$;

但是要像这样包装一个简单的 SELECT ,language sql无论如何使用函数要好得多,并且您可以直接返回结果。

CREATE OR REPLACE FUNCTION validate(_identityid integer, _postid integer) 
  RETURNS integer
  LANGUAGE sql
  stable
AS
$$
    SELECT postid
    FROM post 
    WHERE
            postid = _postid
      AND
            identityid = _identityid;
$$;
于 2021-01-14T18:03:43.817 回答
1

如果你想在不使用的plpgsql情况下使用RETURN你需要一个OUT参数:

CREATE OR REPLACE FUNCTION public.out_test(in_val integer, OUT out_val integer)
 LANGUAGE plpgsql
AS $function$
BEGIN
    SELECT INTO out_val in_val + 1;
END;
$function$

select out_test(3);
 out_test 
----------
        4


根据返回的文档:

函数的返回值不能未定义。如果控制到达函数顶层块的末尾而没有命中 RETURN 语句,则会发生运行时错误。但是,此限制不适用于具有输出参数的函数和返回 void 的函数。在这些情况下,如果顶级块完成,则会自动执行 RETURN 语句。

于 2021-01-14T20:31:16.633 回答