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