在Postgresql中返回“record”的函数需要列定义列表

时间:2016-08-26 06:26:48

标签: sql postgresql

在Next Postgresql函数中我试图从2个不同的表中获取结果但是它会抛出错误错误:42601:返回“记录”的函数需要列定义列表。任何人都可以帮助我。

CREATE OR REPLACE FUNCTION load_page_record(IN _session INT) RETURNS RECORD AS
$$
DECLARE r1 RECORD;
DECLARE r2 RECORD;
DECLARE RESULT RECORD;
BEGIN
    SELECT array_agg(sq.*) AS arr INTO r1
    FROM (SELECT user_id, user_name 
          FROM "user" 
          ) sq;
    SELECT array_agg(sq.*) AS arr INTO r2
    FROM (SELECT client_id, client_name 
          FROM "clients"
          ) sq;

    SELECT r1.arr, r2.arr INTO RESULT;
    RETURN RESULT;
END;
$$ LANGUAGE plpgsql;

3 个答案:

答案 0 :(得分:3)

它返回一条记录,

所以你应该调用下面的函数,

select load_page_record(5);

如果将其称为表格

,则会出现错误
select * from load_page_record(5);

如果您想要返回一个表格位置,您可以在主体内部进行查询,如下所示,

CREATE OR REPLACE FUNCTION load_page_record1(IN _session INT) 
RETURNS TABLE (column1 integer, column2 integer) as
$BODY$

    SELECT column1, column2
    FROM
    table1 a
    join
    table2 b
    ON a.id = b.id

 $BODY$

LANGUAGE plpgsql;

答案 1 :(得分:1)

试试这个,程序返回表

CREATE OR REPLACE FUNCTION load_page_record(IN _session INT) 
RETURNS table(col1 record[],col2 record[]) AS
$BODY$
BEGIN
    RETURN QUERY 
    select
    (SELECT array_agg(sq.*)
    FROM (SELECT user_id, user_name 
          FROM "user" 
          ) sq
    ),
    (SELECT array_agg(sq.*)
    FROM (SELECT client_id, client_name 
          FROM "clients"
          ) sq
    );
END;
$BODY$ LANGUAGE plpgsql stable;

编辑:转换为文字,试一试

CREATE OR REPLACE FUNCTION load_page_record(IN _session INT) 
RETURNS table(col1 text,col2 text) AS
$BODY$
BEGIN
    RETURN QUERY 
    select
    (SELECT array_agg(sq.*)
    FROM (SELECT user_id, user_name 
          FROM "user" 
          ) sq
    )::text,
    (SELECT array_agg(sq.*)
    FROM (SELECT client_id, client_name 
          FROM "clients"
          ) sq
    )::text;
END;
$BODY$ LANGUAGE plpgsql stable;

答案 2 :(得分:0)

尝试使用text:

CREATE OR REPLACE FUNCTION load_page_record(IN _session INT) RETURNS text AS
$$
DECLARE r1 RECORD;
DECLARE r2 RECORD;
DECLARE RESULT text;
BEGIN
    SELECT array_agg(sq.*) AS arr INTO r1
    FROM (SELECT 'fdfdfd','fdfdd'
          ) sq;
    SELECT array_agg(sq.*) AS arr INTO r2
    FROM (SELECT 'dsds','sdsd' 
          ) sq;

    SELECT r1.arr, r2.arr INTO RESULT;
    RETURN RESULT;
END;
$$ LANGUAGE plpgsql;

然后简单地说:

select * from load_page_record(8);

但我希望您知道这条说明SELECT r1.arr, r2.arr INTO RESULT;只会将第一列分配给RESULT吗?