Postgres har en dedikerad funktion för detta ändamål. Introducerad med Postgres 8.4. Manualen:
pg_get_function_identity_arguments(func_oid)
... hämta argumentlista för att identifiera en funktion (utan standardvärden) ...
pg_get_function_identity_arguments
returnerar den argumentlista som är nödvändig för att identifiera en funktion, i den form som den skulle behöva visas iALTER FUNCTION
, till exempel. Detta formulär utelämnar standardvärden.
Använder det (och format()
, introducerad med Postgres 9.1), genererar följande fråga DDL-satser för att ta bort funktioner som matchar dina söktermer:
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;
Systemkatalogen pg_proc
ändrades i Postgres 11 . proisagg
ersattes av prokind
, sanna lagrade procedurer lades till. Du måste anpassa dig. Se:
- Hur släpper jag alla mina funktioner i PostgreSQL?
Returnerar:
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);
Hittade fyra matchningar i exemplet eftersom dblink använder överbelastade funktioner.
Kör DROP
uttalanden selektivt!
Alternativt , kan du använda den bekväma casten till objektidentifieraren typ regprocedure
som returnerar en komplett funktionssignatur inklusive argumenttyper:
-- 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;