O Postgres tem uma função dedicada para isso. Introduzido com o Postgres 8.4. O manual:
pg_get_function_identity_arguments(func_oid)
... obter lista de argumentos para identificar uma função (sem valores padrão) ...
pg_get_function_identity_arguments
retorna o argumento listnecessário para identificar uma função, na forma que precisaria aparecer dentro deALTER FUNCTION
, por exemplo. Este formulário omite os valores padrão.
Usando isso (e
format()
, introduzido com o Postgres 9.1), a seguinte consulta gera instruções DDL para eliminar funções que correspondem aos seus termos de pesquisa: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;
O catálogo do sistema
pg_proc
alterado no Postgres 11 . proisagg
foi substituído por prokind
, verdadeiros procedimentos armazenados foram adicionados. Você precisa se adaptar. Ver:- Como eliminar todas as minhas funções no PostgreSQL?
Devoluções:
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);
Foram encontradas quatro correspondências no exemplo porque o dblink usa funções sobrecarregadas.
Execute
DROP
declarações seletivamente! Alternativamente , você pode usar a conversão conveniente para o tipo de identificador de objeto
regprocedure
que retorna uma assinatura de função completa, incluindo tipos de argumento:-- 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;