我想在postgresql中获取存储过程的参数列表,是否有任何查询来获取参数?
我有一个系统程序来做同样的事情,这是:
SELECT pg_get_function_identity_arguments('funcname'::regproc);
但是,如果有多个具有相同名称的函数,则会返回错误。
任何解决方案??
提前致谢..
答案 0 :(得分:0)
对于my tool that reports PostgreSQL schema,我使用的是:
SELECT CASE
WHEN pg_proc.proretset
THEN 'setof ' || pg_catalog.format_type(pg_proc.prorettype, NULL)
ELSE pg_catalog.format_type(pg_proc.prorettype, NULL) END,
pg_proc.proargtypes,
pg_proc.proargnames,
pg_proc.prosrc,
pg_proc.proallargtypes,
pg_proc.proargmodes,
pg_language.lanname
FROM pg_catalog.pg_proc
JOIN pg_catalog.pg_namespace ON (pg_proc.pronamespace = pg_namespace.oid)
JOIN pg_catalog.pg_language ON (pg_proc.prolang = pg_language.oid)
WHERE
pg_proc.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
AND (pg_proc.proargtypes[0] IS NULL
OR pg_proc.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype)
AND NOT pg_proc.proisagg
AND pg_proc.proname ilike 'MY_FUNCTION_NAME'
AND pg_namespace.nspname = 'public'
AND pg_catalog.pg_function_is_visible(pg_proc.oid);
见其结果的第2和第3列。
答案 1 :(得分:0)
对于 OP 来说为时已晚,但无论如何:我今天自己搜索了答案,但没有找到所需的答案。
我想出了这个解决方案:
SELECT
pronamespace::regnamespace,
proname,
pg_get_function_arguments(oid) AS args_def, -- full definition of arguments with defaults
UNNEST(string_to_array(pg_get_function_identity_arguments(oid), ',' )) AS arg -- each argument with type
FROM
pg_proc
适用于 postgresql 11.x,我想它也必须适用于其他版本,但未经过测试。
希望这对将来有人有所帮助。