PL / pgSQL - 从FUNCTION返回单个记录

时间:2017-01-09 12:23:14

标签: postgresql plpgsql

我正在使用PL / pgSQL创建一个SP:

CREATE OR REPLACE FUNCTION get_performance_achieve (p_month INT,p_year INT, p_uid INT) 
RETURNS TABLE (
field1 INT,
field2 INT
) 
AS $datarows$
DECLARE var_r record;
BEGIN
field1 :=0;
field2 :=0;

FOR var_r IN(select COUNT(id) as counter from "TABLE_A" 
       )  
    LOOP
    field1 := (var_r.counter) ; 
    RETURN NEXT;
END LOOP;

FOR var_r IN(select COUNT(id) as counter from "TABLE_B" 
       )  
    LOOP
    field2 := (var_r.counter) ; 
    RETURN NEXT;
END LOOP;

END; 
$datarows$
LANGUAGE 'plpgsql';

当我执行SP时,它将返回2条记录:

  1. field1,0
  2. field1,field2
  3. 如何只使用 field1,field2

    返回单个记录

2 个答案:

答案 0 :(得分:5)

如果您想要返回单个记录,我不会看到您使用returns table的原因。一个简单的returns record就是这样做的:返回一条记录:

CREATE OR REPLACE FUNCTION get_performance_achieve (p_month INT,p_year INT, p_uid INT) 
   RETURNS record --<< here
AS $datarows$
DECLARE
  l_count1 bigint;
  l_count2 bigint;
BEGIN
  select COUNT(id) into l_count1 from "TABLE_A";
  select COUNT(id) into l_count2 from "TABLE_B";
  RETURN (l_count1, l_count2);
END; 
$datarows$
LANGUAGE plpgsql;

要运行它,请使用例如:

select get_performance_achieve(1,2017,42);

然而,上面会创建一个匿名记录,其中字段没有名称。

如果您需要,请改为声明两个OUT参数:

CREATE OR REPLACE FUNCTION get_performance_achieve (p_month INT,p_year INT, p_uid INT, field1 out integer, field2 out integer) 
AS $datarows$
BEGIN
  select COUNT(id) into field1 from "TABLE_A";
  select COUNT(id) into field2 from "TABLE_B";
  RETURN (l_count1, l_count2);
END; 
$datarows$
LANGUAGE plpgsql;

你以同样的方式称呼它:

select get_performance_achieve(1,2017,42);

它会返回,例如(1,2)

如果要将记录的每个字段视为结果列,则需要使用:

select (get_performance_achieve(1,2017,42)).*;

如第一个例子所示,匿名记录无法实现上述目标。

答案 1 :(得分:2)

在这种情况下,循环是多余的,使用简单的赋值:

CREATE OR REPLACE FUNCTION get_performance_achieve (p_month INT,p_year INT, p_uid INT) 
RETURNS TABLE (
    field1 INT,
    field2 INT
) 
AS $datarows$
BEGIN
    field1 := (select COUNT(id) as counter from "TABLE_A");
    field2 := (select COUNT(id) as counter from "TABLE_B");

    RETURN NEXT;
END; 
$datarows$
LANGUAGE 'plpgsql';
相关问题