4

我正在尝试创建一个 PL/pgSQL 函数,它应该填充一个临时表,然后从中返回所有行(稍后将是一个连接),但我不知道要为其指定哪种返回类型:

create or replace function pref_daily_misere() returns void as $BODY$
        begin

        create temporary table temp_best (id varchar not null) on commit drop;
        insert into temp_best (id) select id from pref_money where
            yw = to_char(current_timestamp - interval '1 week', 'IYYY-IW')
            order by money desc limit 10;
        select id from temp_best;
        end;
$BODY$ language plpgsql;

上面的陈述可以自己工作,但给我错误

# select pref_daily_misere();
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "pref_daily_misere" line 7 at SQL statement

当我尝试在我的 PostgreSQL 8.4.11 数据库中调用它时。

这可能是因为我错误地指定了上面的返回 void,但我不知道要使用哪种返回类型,而省略返回类型是编译错误。

4

1 回答 1

5

您想使用setof varchar返回类型,然后return query ...在函数内部。来自精美手册

39.6.1.2。返回下一个并返回查询

RETURN NEXT expression;
RETURN QUERY query;
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

当一个 PL/pgSQL 函数被声明为返回SETOF sometype时,遵循的过程略有不同。在这种情况下,要返回的各个项目由一系列RETURN NEXTRETURN QUERY命令指定,然后RETURN使用不带参数的最终命令来指示函数已完成执行。

我想你想要更像这样的东西:

create or replace function pref_daily_misere() returns setof varchar as $BODY$
begin
    create temporary table temp_best (id varchar not null) on commit drop;
    insert into temp_best (id)
    select id
    from pref_money
    where yw = to_char(current_timestamp - interval '1 week', 'IYYY-IW')
    order by money
    desc limit 10;
    return query select id from temp_best;
    return;
end;
$BODY$ language plpgsql;

但是,临时表在这里毫无意义:

注意:当前实现RETURN NEXTRETURN QUERY在从函数返回之前存储整个结果集,如上所述。

所以 PostgreSQL 正在计算整个结果集并自己缓存它。你可以这样做:

create or replace function pref_daily_misere() returns setof varchar as $BODY$
begin
    return query
        select id
        from pref_money
        where yw = to_char(current_timestamp - interval '1 week', 'IYYY-IW')
        order by money
        desc limit 10;
    return;
end;
$BODY$ language plpgsql;

我很确定临时表无论如何都会在你的函数结束时被删除,所以你应该摆脱它。

于 2012-06-10T22:29:22.697 回答