PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como obter listas de parâmetros de função (para que eu possa descartar uma função)


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 de ALTER 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;