Postgresql如何实现函数返回表调用函数返回相同类型的记录

问题描述 投票:0回答:1

我确实想从DB中的所有表中查询特定信息。

select * 
from [pg_catalog.]pg_tables 
where schemaname = '<Schema>';

在不创建临时表的情况下,唯一的方法(我接受任何建议)是开发一个函数,在模式表上执行循环(Loop on Cursor with that query),然后对模式中的每个表调用一个执行动态pgsql的函数,从模式中的那个表获取所需信息。 第二个函数需要动态SQL(我相信),因为我要执行查询的表名会有所不同,所以,应该将其作为函数的参数。

我们的想法是,这个 "被调用 "的函数将返回一个记录类型,然后主函数(或 "调用")应该返回一个表类型,这就是我迷茫的地方。

我不知道如何解决(也不知道可以解决)的是,如何构造一个返回表类型的函数(或者一些数据结构,当我从sql编辑器中调用函数时可以列出),并在内部调用一个返回记录的函数(与 "调用 "函数返回的表结构相同)。 在我看到的所有关于函数返回表的例子中,返回的是一个select的执行,但是我没有找到任何一个pgsql函数返回表类型的例子,在内部构造表结构。 而且我也不知道这是否可能。

  • 当然,同样的例子也可以用一个函数来实现,但我还是会发现同样的问题,即一个返回表类型的函数执行不同的返回记录类型的查询。 先谢谢您了。
postgresql
1个回答
0
投票

假设所有的表都有一个相同的结构,你不需要另一个函数,这一切可以在一个函数中完成。

create function get_all()
  returns table (table_name text, column_1 .., column_2 ..., column_3 ...) -- specify columns and data types
as
$$
declare 
  l_rec record;
  l_sql text;
begin
  for l_rec in select schemaname, tablename
               from pg_tables
               where schemaname = 'bla'
  loop
    l_sql := format('select %L, column_1, column_2, column_3 from %I.%I', 
                    l_rec.tablename, l_rec.schemaname, l_rec.tablename);
    return query execute l_sql;
  end loop;
end
$$
language plpgsql;

正如文档中所描述的 在手册中。RETURN QUERY 并没有终止函数,只是在结果中增加了另一组行。

如果表没有共同的列(这使得这个问题其实很奇怪),我会将行返回为JSON值。

create function get_all()
  returns table (table_name text, row_data jsonb) -- specify columns and data types
as
$$
declare 
  l_rec record;
  l_sql text;
begin
  for l_rec in select schemaname, tablename
               from pg_tables
               where schemaname = 'bla'
  loop
    l_sql := format('select %L, to_jsonb(t) from %I.%I as t', 
                    l_rec.schemaname, l_rec.schemaname, l_rec.tablename);
    return query execute l_sql;
  end loop;
end
$$
language plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.