Postgresql 如何获取表返回函数的返回类型的列定义列表

Postgresql 如何获取表返回函数的返回类型的列定义列表,postgresql,postgresql-12,Postgresql,Postgresql 12,我正在攻读博士后12年级。我定义了一些函数,它们将表(…)作为返回值。我知道如何查询信息_schema和/或pg_proc,以获得给定函数名称和模式的函数参数列表。我想对返回类型做一些类似的事情,当它是一个表时,也就是说,查找一个查询,当函数返回一组记录时,将返回返回表列的序号位置和oid(或名称)列表 可能吗 编辑:我知道pg_get_function_result()返回函数定义中写入的返回定义文本,但我必须对其进行解析,我想知道是否有更简单的方法。pg_proc.prorettype将包含

我正在攻读博士后12年级。我定义了一些函数,它们将表(…)作为返回值。我知道如何查询信息_schema和/或pg_proc,以获得给定函数名称和模式的函数参数列表。我想对返回类型做一些类似的事情,当它是一个表时,也就是说,查找一个查询,当函数返回一组记录时,将返回返回表列的序号位置和oid(或名称)列表

可能吗


编辑:我知道pg_get_function_result()返回函数定义中写入的返回定义文本,但我必须对其进行解析,我想知道是否有更简单的方法。

pg_proc.prorettype
将包含表类型的OID,因此您可以使用:

select prorettype::regtype::text
from pg_proc
where proname = 'your_function';
获取类型的名称-这也是表的名称

要获取所有列,您可以将pg_proc与pg_类联接以获取表的oid,然后使用它来查找列

select col.attname, col.attnum, format_type(col.atttypid, col.atttypmod) as data_type
from pg_attribute col
where not attisdropped
  and attnum > 0
  and attrelid in (select tbl.oid
                   from pg_class tbl
                      join pg_proc p on p.prorettype = tbl.reltype
                   where p.proname = 'your_function_name_here')
order by col.attnum

如果需要获取定义为
returns table()
的函数返回的列名,则可在数组
pg_proc.proargnames
中找到这些列名,用于通过
proargmodes
定义为“out”参数的列名

select t.column_name, t.arg_type::regtype::text, t.col_num
from pg_proc p
  cross join unnest(proargnames, proargmodes, proallargtypes) with ordinality as t(column_name, arg_mode, arg_type, col_num)
where p.proname = 'your_function_name_here'
  and t.arg_mode = 't'
order by t.col_num;

pg_proc.prorettype
将包含表类型的OID,因此您可以使用:

select prorettype::regtype::text
from pg_proc
where proname = 'your_function';
获取类型的名称-这也是表的名称

要获取所有列,您可以将pg_proc与pg_类联接以获取表的oid,然后使用它来查找列

select col.attname, col.attnum, format_type(col.atttypid, col.atttypmod) as data_type
from pg_attribute col
where not attisdropped
  and attnum > 0
  and attrelid in (select tbl.oid
                   from pg_class tbl
                      join pg_proc p on p.prorettype = tbl.reltype
                   where p.proname = 'your_function_name_here')
order by col.attnum

如果需要获取定义为
returns table()
的函数返回的列名,则可在数组
pg_proc.proargnames
中找到这些列名,用于通过
proargmodes
定义为“out”参数的列名

select t.column_name, t.arg_type::regtype::text, t.col_num
from pg_proc p
  cross join unnest(proargnames, proargmodes, proallargtypes) with ordinality as t(column_name, arg_mode, arg_type, col_num)
where p.proname = 'your_function_name_here'
  and t.arg_mode = 't'
order by t.col_num;

谢谢。正是我想要的。非常感谢。正是我想要的。