如何从PL/pgSQL函数返回多行?

Asm*_*air 4 postgresql plpgsql

我花了很多时间试图解决它,但我无法解决它.所以,我需要你的帮助.

我正在尝试编写一个返回多行的PL/pgSQL函数.我写的函数如下所示.但它没有用.

CREATE OR REPLACE FUNCTION get_object_fields()
RETURNS SETOF RECORD
AS 
$$
DECLARE result_record keyMetrics;
BEGIN
    return QUERY SELECT department_id into result_record.visits 
    from fact_department_daily 
    where report_date='2013-06-07';
    --return result_record;
END

$$ LANGUAGE plpgsql; 

SELECT * FROM get_object_fields;
Run Code Online (Sandbox Code Playgroud)

它返回此错误:

错误:RETURN在函数返回集中没有参数;
在"QUERY"或其附近使用RETURN NEXT

Erw*_*ter 10

修复已经指出的错误@Pavel后,还要正确定义返回类型,或者必须为每次调用提供列定义列表.

这个电话:

SELECT * FROM get_object_fields()
Run Code Online (Sandbox Code Playgroud)

要求Postgres知道如何扩展*.由于您要返回匿名记录,因此会出现异常:

错误:返回"记录"的函数需要列定义列表

解决这个问题的一种方法(RETURNS TABLEPostgres 8.4+):

CREATE OR REPLACE FUNCTION get_object_fields()
  RETURNS TABLE (department_id int) AS 
$func$
BEGIN
   RETURN QUERY
   SELECT department_id
   FROM   fact_department_daily 
   WHERE  report_date = '2013-06-07';
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

适用于SQL函数的功能完全相同.

这个密切相关答案的更多细节和链接:
PostgreSQL:错误:42601:返回"记录"的函数需要列定义列表


Pav*_*ule 7

我看到更多错误:

首先,SET RETURNING FUNCTIONS 调用具有以下语法

从 get_object_fields() 中选择*

第二个 - RETURN QUERY 将查询结果直接转发到输出。您无法将此结果存储到变量中 - 现在在 PostgreSQL 中这是不可能的。

开始
  返回查询选择....;-- 结果直接转发到输出
  返回; -- 不会有下一个结果,执行结束
结尾;

第三 - 这些简单的功能最好用 SQL 语言实现

创建或替换函数 get_object_fields()
返回 SetOF 记录为 $$
选择部门 ID,其中...
$$ 语言 SQL 稳定;