gpt4 book ai didi

postgresql - 如何从 pg_catalog 或 information_schema 读取函数返回表定义

转载 作者:行者123 更新时间:2023-11-29 13:25:20 25 4
gpt4 key购买 nike

我想读取和处理函数返回表类型的列定义...并检测函数返回类型是否为表。

我在 information_schema.parameters 中找到了列,但我无法区分它是 OUT 标记的参数还是返回表列定义。

在 pg 源代码中,我注意到“argmode”或“PROARGMODE”,但我不知道如何在 information_schemapg_catalog 中找到此信息。

我知道可以解析 pg_catalog.pg_get_function_result() 的结果。

第 9.4 页

最佳答案

pg_proc catalog 中有两列: proargtypesproallargtypes。第一个包含函数输入参数的数据类型,而第二个包含所有参数的数据类型。要仅获取输出参数的类型,您应该获取一段 proallargtypes 跳过 proargtypes 的元素:

create or replace function function_return_types(p pg_proc)
returns oid[] language sql as $$
select p.proallargtypes[array_length(p.proargtypes, 1)+ 1 : array_length(p.proallargtypes, 1)]
$$;

示例函数和检索其返回类型的查询:

create or replace function test_function (int, date, text)
returns table (i int, d date, t text)
language sql as $$
select $1, $2, $3;
$$;

select proname, function_return_types(p)
from pg_proc p
where proname = 'test_function';

proname | function_return_types
---------------+-----------------------
test_function | {23,1082,25}
(1 row)

该函数返回 oid 数组。您可以使用它来获取类型名称:

create or replace function function_return_type_names(p pg_proc)
returns name[] language sql as $$
select array_agg(typname)
from (
select typname
from unnest(function_return_types(p)) with ordinality u
join pg_type t on t.oid = u
order by ordinality
) s
$$;

select proname, function_return_type_names(p)
from pg_proc p
where proname = 'test_function';

proname | function_return_type_names
---------------+----------------------------
test_function | {int4,date,text}
(1 row)

上面的答案是旧的,有点过时了。在 Postgres 14 中,我正在使用这个函数:

create or replace function function_out_args_types(p pg_proc)
returns name[] language sql as $$
select array_agg(t::regtype order by o)
from unnest(
p.proallargtypes[p.pronargs+ 1 :]
) with ordinality a(t, o)
$$;

使用示例:

select 
proname as function_name,
function_out_args_types(p),
proretset as srf,
prorettype::regtype as return_type
from pg_proc p
where proname = 'test_function';

function_name | function_out_args_types | srf | return_type
---------------+-------------------------+-----+-------------
test_function | {integer,date,text} | t | record
(1 row)

srf - 函数返回行集。

关于postgresql - 如何从 pg_catalog 或 information_schema 读取函数返回表定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34883062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com