Postgres heeft daarvoor een speciale functie. Geïntroduceerd met Postgres 8.4. De handleiding:
pg_get_function_identity_arguments(func_oid)... krijg een lijst met argumenten om een functie te identificeren (zonder standaardwaarden) ...
pg_get_function_identity_argumentsgeeft de argumentenlijst terug die nodig is om een functie te identificeren, in de vorm waarin deze zou moeten verschijnen inALTER FUNCTION, bijvoorbeeld. Dit formulier laat standaardwaarden weg.
Dat gebruiken (en format() , geïntroduceerd met Postgres 9.1), genereert de volgende query DDL-instructies om functies te laten vallen die overeenkomen met uw zoektermen:
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;
De systeemcatalogus pg_proc gewijzigd in Postgres 11 . proisagg werd vervangen door prokind , zijn echte opgeslagen procedures toegevoegd. Je moet je aanpassen. Zie:
- Hoe verwijder ik al mijn functies in PostgreSQL?
Retourneren:
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);
Vier overeenkomsten gevonden in het voorbeeld omdat dblink overbelaste functies gebruikt.
Voer DROP uit uitspraken selectief!
Alternatief , kunt u de handige cast naar het object-ID-type regprocedure . gebruiken die een volledige functiehandtekening retourneert, inclusief argumenttypes:
-- 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;