2012-08-26 40 views
14

我想让SQL在PostgreSQL中删除一个函数。我写了DROP FUNCTIONpg_proc的获取函数名称。这不是问题。但是,如果我留下空白参数,它不会放弃该功能。如何获取函数参数列表(这样我可以删除一个函数)

我检查了手册,然后写出来,然后我必须用它的参数识别功能来删除它,例如DROP FUNCTION some_func(text,integer)不只是DROP FUNCTION some_func

我在哪里可以找到参数?在pg_proc表中的函数的行中没有参数。那么我怎样才能让SQL放弃这个功能呢?

+2

通过pgAdmin查看函数。 – 2012-08-26 02:55:13

+2

['psql'](http://www.postgresql。组织/文档/电流/静态/ APP-psql.html)。 –

回答

24

Postgres有专门的功能。 Postgres引入8.4。 The manual:

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; 

返回:

    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); 

发现了四个在该示例中匹配,因为dblink使用overloaded functions
运行DROP选择性地陈述!

或者,您可以使用便捷的投给它返回一个完整的函数签名,包括参数类型object identifier type 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; 
+2

....这就是我喜欢SO的原因。使用Pg 4年,我从来不知道这一点。甜。 –

+0

非常感谢,这正是我在寻找的。大! – John

1

使用pgadminIII和直接访问功能列表,右键单击它,然后选择删除enter image description here

0

如果你正在使用一个以前版本的postgres,为此pg_get_function_identity_arguments(func_oid)不存在,我创建自己的函数获取参数从函数开始,你只需要传递函数的oid,你需要将下面的函数部署到你的postgres数据库中。

CREATE OR REPLACE FUNCTION public.getFunctionParameter(functionOid oid) 
    RETURNS text AS 
$BODY$ 

declare 
    t_paras text; 
    paras oid[]; 
    res text :='('; 
begin 

select proargtypes into t_paras from pg_proc where oid=functionOid; 
if t_paras is null or t_paras='' then 
    return '()'; 
else 
    paras:=string_to_array(t_paras,' '); 
    for i in array_lower(paras,1) .. array_upper(paras,1) 
    loop 
     raise notice 'para is %',paras[i]; 
     select format_type(paras[i]::oid,NULL) into t_paras; 
     res:=res||t_paras||','; 
    end loop; 
    res:=substring(res from 1 for char_length(res)-1); 
    res:=res||')'; 
    return res; 
end if; 

end 

    $BODY$ 
     LANGUAGE plpgsql ; 

功能下面将列出函数名和参数,更改架构名称,如果你想在一些其他模式获得的功能,我使用公共例如

SELECT n.nspname||'.'||p.proname||public.getFunctionParameter(p.oid) 
FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace 
WHERE n.nspname='public' 

你会结果像下面一样

1 "public.getfunctionparameter(integer,text)" 
2 "public.getfunctionparameter(oid)" 
相关问题