Postgresql 如何从函数返回一个表?

Postgresql 如何从函数返回一个表?,postgresql,types,plpgsql,Postgresql,Types,Plpgsql,为什么??如何修复它?您需要提供一个列定义列表,其中包含返回表子句: 创建功能测试\u提取\u文本( tm_id1 int4、tm_subid1 int4、tm_id2 int4、tm_subid2 int4) 将表(col1 type1,col2 type2,…)返回为 $$ 开始 返回查询 挑选* 从数据中提取文本e 连接数据替换e.Id=r.subid上的文本r; 结束 $$语言plpgsql 虽然允许使用SELECT*,但您也应该在这里提供一个列列表。否则,对其中一个相关表的每一次更改都

为什么??如何修复它?

您需要提供一个列定义列表,其中包含
返回表
子句:

创建功能测试\u提取\u文本(
tm_id1 int4、tm_subid1 int4、tm_id2 int4、tm_subid2 int4)
将表(col1 type1,col2 type2,…)返回为
$$
开始
返回查询
挑选*
从数据中提取文本e
连接数据替换e.Id=r.subid上的文本r;
结束
$$语言plpgsql

虽然允许使用
SELECT*
,但您也应该在这里提供一个列列表。否则,对其中一个相关表的每一次更改都会破坏该函数。

但是我有很多列(500列)@user1497597:那是很多列。提出是否可以改进数据库架构的问题。如果您在多个函数中需要相同的表类型,您可以创建一个类型并使用
返回my_composite_type的集合
…您有什么不同吗?@user1497597:我不理解最后一个问题,抱歉。@user1497597 Woah。如果您有500列,那么几乎肯定需要修复表设计。。。您将遇到严重的性能问题,如果继续添加列,列数将达到限制。看见如果您真的必须这样做,那么
创建类型mytype(…)
返回设置mytype
将是唯一模糊实用的方法。
CREATE FUNCTION Test_Extract_Text(tm_id1 int4, tm_subid1 int4, tm_id2 int4, tm_subid2 int4)
RETURNS Table 
AS $$
BEGIN
    RETURN QUERY SELECT * FROM dat_extract_text inner join dat_replace_text on dat_extract_text.Id=dat_replace_text.subid ;
END;
$$ LANGUAGE plpgsql;
ERROR:  syntax error at or near "AS"
LINE 3: AS $$
CREATE FUNCTION Test_Extract_Text(
   tm_id1 int4, tm_subid1 int4, tm_id2 int4, tm_subid2 int4)
RETURNS TABLE (col1 type1, col2 type2, ...) AS
$$
BEGIN
   RETURN QUERY
   SELECT *
   FROM   dat_extract_text e
   JOIN   dat_replace_text r ON e.Id = r.subid;
END
$$ LANGUAGE plpgsql;