我正在尝试在 PostgreSQL 9.3 中的 PL/pgSQL 函数中编写一个返回表的循环。我使用 RETURN NEXT;
在循环中的每个查询之后没有参数,下面是我发现的示例,例如:
但是,我仍然遇到错误:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
下面是重现该问题的最小代码示例。谁能帮忙解释一下如何修复测试代码以返回一个表?
最小的例子:
CREATE OR REPLACE FUNCTION test0()
RETURNS TABLE(y integer, result text)
LANGUAGE plpgsql AS
$func$
DECLARE
yr RECORD;
BEGIN
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
SELECT yr.y, 'hi';
RETURN NEXT;
END LOOP;
RETURN;
END
$func$;
最佳答案
给出的示例可以完全替换为RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
这将很多快。
一般来说,您应该尽可能避免迭代,而应该支持面向集合的操作。
如果return next
循环是不可避免的(这种情况很少见,并且主要局限于需要异常处理的情况),则必须设置OUT
参数值或表参数, 然后 return next
没有参数。
在这种情况下,您的问题是行 SELECT yr.y, 'hi';
什么都不做。您假设 SELECT
的隐式目标是输出参数,但事实并非如此。您必须像@peterm 那样使用输出参数作为循环变量,使用赋值或使用 SELECT INTO
:
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
y := yr.y;
result := 'hi';
RETURN NEXT;
END LOOP;
RETURN;
关于postgresql - 如何在 PL/pgSQL 函数中使用 RETURN NEXT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663197/