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;