我确实想从DB中的所有表中查询特定信息。
select *
from [pg_catalog.]pg_tables
where schemaname = '<Schema>';
在不创建临时表的情况下,唯一的方法(我接受任何建议)是开发一个函数,在模式表上执行循环(Loop on Cursor with that query),然后对模式中的每个表调用一个执行动态pgsql的函数,从模式中的那个表获取所需信息。 第二个函数需要动态SQL(我相信),因为我要执行查询的表名会有所不同,所以,应该将其作为函数的参数。
我们的想法是,这个 "被调用 "的函数将返回一个记录类型,然后主函数(或 "调用")应该返回一个表类型,这就是我迷茫的地方。
我不知道如何解决(也不知道可以解决)的是,如何构造一个返回表类型的函数(或者一些数据结构,当我从sql编辑器中调用函数时可以列出),并在内部调用一个返回记录的函数(与 "调用 "函数返回的表结构相同)。 在我看到的所有关于函数返回表的例子中,返回的是一个select的执行,但是我没有找到任何一个pgsql函数返回表类型的例子,在内部构造表结构。 而且我也不知道这是否可能。
假设所有的表都有一个相同的结构,你不需要另一个函数,这一切可以在一个函数中完成。
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;