sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo obtener listas de parámetros de funciones (para que pueda descartar una función)

Postgres tiene una función dedicada para ese propósito. Introducido con Postgres 8.4. El manual:

pg_get_function_identity_arguments(func_oid) ... obtener una lista de argumentos para identificar una función (sin valores predeterminados) ...

pg_get_function_identity_arguments devuelve la lista de argumentos necesaria para identificar una función, en la forma en que debería aparecer dentro de ALTER FUNCTION , por ejemplo. Este formulario omite los valores predeterminados.

Usando eso (y format() , introducido con Postgres 9.1), la siguiente consulta genera instrucciones DDL para descartar funciones que coincidan con sus términos de búsqueda:

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;

El catálogo del sistema pg_proc cambiado en Postgres 11 . proisagg fue reemplazado por prokind , se agregaron procedimientos almacenados verdaderos. Necesitas adaptarte. Ver:

  • ¿Cómo eliminar todas mis funciones en PostgreSQL?

Devoluciones:

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

Encontré cuatro coincidencias en el ejemplo porque dblink usa funciones sobrecargadas.
Ejecute DROP declaraciones selectivamente!

Alternativamente , puede usar la conversión conveniente al tipo de identificador de objeto regprocedure que devuelve una firma de función completa que incluye tipos de argumentos:

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