Postgres má pro tento účel vyhrazenou funkci. Představeno s Postgres 8.4. Manuál:
pg_get_function_identity_arguments(func_oid)
... získat seznam argumentů k identifikaci funkce (bez výchozích hodnot) ...
pg_get_function_identity_arguments
vrátí seznam argumentů nezbytný k identifikaci funkce ve tvaru, který by se měl objevit v rámciALTER FUNCTION
, například. Tento formulář vynechává výchozí hodnoty.
Pomocí toho (a format()
, představený v Postgres 9.1), následující dotaz generuje příkazy DDL, aby odstranil funkce odpovídající vašim hledaným výrazům:
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;
Systémový katalog pg_proc
změněno v Postgres 11 . proisagg
bylo nahrazeno prokind
byly přidány skutečné uložené procedury. Je potřeba se přizpůsobit. Viz:
- Jak zrušit všechny mé funkce v PostgreSQL?
Vrátí:
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);
V příkladu byly nalezeny čtyři shody, protože dblink používá přetížené funkce.
Spustit DROP
prohlášení selektivně!
Alternativně , můžete použít pohodlné přetypování na typ identifikátoru objektu regprocedure
který vrátí úplný podpis funkce včetně typů argumentů:
-- 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;