如何获取有关 PostgreSQL 中函数参数的定量和定性信息?
How to get quantitative and qualitative info about function arguments in PostgreSQL?
我有以下功能:
func_name(p_1, p_2, p_3, ...)
函数的body有没有办法query和get,例如:
a) 当前函数arguments/parameters的总数
b) 其中类型
当然,我可以将函数修改为
func_name(n, ..., p_1, p_2, p_3, ...)
并包括我需要的信息作为参数,但这并不能让我开心!
我更愿意创建一个包含所有函数信息(函数名称、函数参数名称和类型)的 table 并在必要时进行查询。
蒂亚
你可以试试解析。设 fn() 为:
t=# create or replace function fn(i int, t text) returns void as $$
declare
c text;
a text[];
begin
GET DIAGNOSTICS c = PG_CONTEXT;
raise info 'name: %',substring(c from 'function (.*?)\(');
a := string_to_array(substring(c from '\((.*?)\)'), ',');
raise info 'args: %',a;
raise info 'names: %', (select proargnames from pg_proc where proname = substring(c from 'function (.*?)\('));
raise info 'amount: %',array_length(a,1);
end;
$$ language plpgsql;
CREATE FUNCTION
所以信息是:
t=# select fn(1,null);
INFO: name: fn
INFO: args: {integer,text}
INFO: names: {i,t}
INFO: amount: 2
fn
----
(1 row)
当然支持不唯一的函数名select等会比较复杂。这只是一个简单的例子
我有以下功能:
func_name(p_1, p_2, p_3, ...)
函数的body有没有办法query和get,例如:
a) 当前函数arguments/parameters的总数
b) 其中类型
当然,我可以将函数修改为
func_name(n, ..., p_1, p_2, p_3, ...)
并包括我需要的信息作为参数,但这并不能让我开心!
我更愿意创建一个包含所有函数信息(函数名称、函数参数名称和类型)的 table 并在必要时进行查询。
蒂亚
你可以试试解析。设 fn() 为:
t=# create or replace function fn(i int, t text) returns void as $$
declare
c text;
a text[];
begin
GET DIAGNOSTICS c = PG_CONTEXT;
raise info 'name: %',substring(c from 'function (.*?)\(');
a := string_to_array(substring(c from '\((.*?)\)'), ',');
raise info 'args: %',a;
raise info 'names: %', (select proargnames from pg_proc where proname = substring(c from 'function (.*?)\('));
raise info 'amount: %',array_length(a,1);
end;
$$ language plpgsql;
CREATE FUNCTION
所以信息是:
t=# select fn(1,null);
INFO: name: fn
INFO: args: {integer,text}
INFO: names: {i,t}
INFO: amount: 2
fn
----
(1 row)
当然支持不唯一的函数名select等会比较复杂。这只是一个简单的例子