如何在postgresql中获取存储过程的参数列表

时间:2014-03-05 08:40:33

标签: sql function postgresql stored-procedures

我想在postgresql中获取存储过程的参数列表,是否有任何查询来获取参数?

我有一个系统程序来做同样的事情,这是:

SELECT pg_get_function_identity_arguments('funcname'::regproc);

但是,如果有多个具有相同名称的函数,则会返回错误。

任何解决方案??

提前致谢..

2 个答案:

答案 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,我想它也必须适用于其他版本,但未经过测试。

希望这对将来有人有所帮助。