postgresql - 如何在 PL/pgSQL 函数中使用 RETURN NEXT?

标签 postgresql plpgsql

我正在尝试在 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/

相关文章:

arrays - 如何从 Postgres 函数返回新创建的 ids 数组?

sql - 重写函数以不返回记录类型

sql - 从函数返回查询?

sql - 如何在某个值差距之前识别每组的行?

ruby-on-rails - Rails PostgreSQL jsonb GROUP BY 对内部动态键的查询

node.js - Node postgres 'event emitter style' 与 'callback style'

database - postgres 9.3+ : constraint to ensure table and column exist in database

postgresql - 如何将递归转换为plpgsql中的函数?

sql - SQuirreL : unterminated dollar-quoted string 中的 PostgreSQL 函数定义

postgresql - 如何使用 for 循环选择字段值并将它们插入到另一个表中