我正在使用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条记录:
如何只使用 field1,field2
返回单个记录答案 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';