Postgres ha una funzione dedicata a tale scopo. Introdotto con Postgres 8.4. Il manuale:
pg_get_function_identity_arguments(func_oid)
... ottieni l'elenco degli argomenti per identificare una funzione (senza valori predefiniti) ...
pg_get_function_identity_arguments
restituisce l'argomento listnecessario per identificare una funzione, nella forma in cui dovrebbe apparire all'interno di ALTER FUNCTION
, per esempio. Questo modulo omette i valori predefiniti.
Usando quello (e format()
, introdotta con Postgres 9.1), la query seguente genera istruzioni DDL per eliminare le funzioni che corrispondono ai termini di ricerca:
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;
Il catalogo di sistema pg_proc
modificato in Postgres 11 . proisagg
è stato sostituito da prokind
, sono state aggiunte vere stored procedure. Devi adattarti. Vedi:
- Come eliminare tutte le mie funzioni in PostgreSQL?
Resi:
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);
Trovate quattro corrispondenze nell'esempio perché dblink usa funzioni sovraccaricate.
Esegui DROP
dichiarazioni in modo selettivo!
In alternativa , puoi utilizzare il comodo cast al tipo di identificatore oggetto regprocedure
che restituisce una firma di funzione completa che include i tipi di argomento:
-- 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;