【问题标题】:A column definition list is required for functions returning "record" in Postgresql在 Postgresql 中返回“记录”的函数需要列定义列表
【发布时间】:2017-01-02 17:35:46
【问题描述】:

在下面的 Postgresql 函数中,我试图从 2 个不同的表中获取结果,但它抛出错误 ERROR: 42601: a column definition list is required for functions return "record". 谁能帮帮我。

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;

【问题讨论】:

  • 选择 r1.arr 作为 col1,r2.arr 作为 col2 进入结果;试试看
  • @Abihabi87 不工作
  • @Abihabi87 我在 2 个表中的选择查询中有 2 列然后如何返回
  • 你真的想返回记录还是你不知道更好?

标签: sql postgresql


【解决方案1】:

它返回一条记录,

所以你应该如下调用函数,

select load_page_record(5);

如果您将其称为表格,则会出现错误

select * from load_page_record(5);

如果你想返回一个你在body里面用join查询的表地方,如下所示,

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;

【讨论】:

  • 你能告诉我把这个查询放在哪里吗?作为我这个数据库的新手
  • 这就是你应该如何调用你的函数来获得结果。只需在您拥有功能的数据库中执行它。我只是输入一个随机整数为 5。
  • 我只是执行它,它运行良好。但是我应该在哪里放置这个查询。或者我应该创建另一个函数并放置这个查询
  • 你想从哪里得到这个函数的数据?因此,您可以从该位置执行查询,以便它将运行函数内的任何查询并为您提供结果。
【解决方案2】:

试试这个,procedur返回表

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;

【讨论】:

  • 它抛出错误 PL/pgSQL 函数不能接受类型记录[]
  • 是否可以在返回时将具有值的列作为表格
【解决方案3】:

尝试文字:

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

【讨论】:

  • 如何获取列名?
猜你喜欢
  • 2012-01-26
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2013-02-19
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多