如何获取函数参数列表(所以我可以删除一个函数)

Joh*_*ohn 20 postgresql ddl function catalog

我想让SQL在PostgreSQL中删除一个函数.我写DROP FUNCTION了一个get函数名pg_proc.那不是问题.但是,如果我留下空白参数,它将不会丢弃该功能.

我检查了手册,然后写了然后我必须用它的参数识别函数来放弃它,例如DROP FUNCTION some_func(text,integer)不仅仅是DROP FUNCTION some_func.

我在哪里可以找到参数?在表中的函数行中pg_proc没有参数.那么如何让SQL删除该函数呢?

Erw*_*ter 32

Postgres具有专门用于此目的的功能.Postgres 8.4推出.手册:

pg_get_function_identity_arguments(func_oid) ...获取参数列表以识别函数(没有默认值)...

pg_get_function_identity_arguments例如,返回标识函数所必需的参数列表,以其需要在其中出现的形式ALTER FUNCTION.此表单省略了默认值.

使用它(并format()在Postgres 9.1中引入),以下查询生成DDL语句以删除与搜索项匹配的函数:

SELECT format('DROP %s %I.%I(%s)'
            , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , n.nspname
            , p.proname
            , pg_catalog.pg_get_function_identity_arguments(p.oid)
             ) AS stmt
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  p.proname = 'dblink'                     -- function name
-- AND n.nspname = 'public'                     -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER  BY 1;
Run Code Online (Sandbox Code Playgroud)

Postgres 11中的系统目录已pg_proc更改.被替换为,真正的存储过程被添加.你需要适应.看到:proisaggprokind

返回:

                  stmt
---------------------------------------------------
 DROP FUNCTION public.dblink(text);
 DROP FUNCTION public.dblink(text, boolean);
 DROP FUNCTION public.dblink(text, text);
 DROP FUNCTION public.dblink(text, text, boolean); 
Run Code Online (Sandbox Code Playgroud)

在示例中找到了四个匹配项,因为dblink使用了重载函数.选择性
运行DROP语句!

或者,您可以使用方便的强制转换为对象标识符类型regprocedure,该类型返回包含参数类型的完整函数签名:

-- SET LOCAL search_path = '';  -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
            , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , oid::regprocedure
             ) AS stmt
FROM   pg_catalog.pg_proc
WHERE  proname = 'dblink'   -- function name
ORDER  BY 1;
Run Code Online (Sandbox Code Playgroud)

  • ....这就是我爱的原因.用Pg做了4年的事情,我从来都不知道.甜. (2认同)