Postgres ma do tego dedykowaną funkcję. Wprowadzony z Postgresem 8.4. Instrukcja:
pg_get_function_identity_arguments(func_oid)
... pobierz listę argumentów do identyfikacji funkcji (bez wartości domyślnych) ...
pg_get_function_identity_arguments
zwraca argument listniezbędny do zidentyfikowania funkcji w postaci, w jakiej musiałby pojawić się w ALTER FUNCTION
, na przykład. Ten formularz pomija wartości domyślne.
Używając tego (i format()
, wprowadzone w Postgresie 9.1), następujące zapytanie generuje instrukcje DDL w celu usunięcia funkcji pasujących do wyszukiwanych haseł:
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;
Katalog systemowy pg_proc
zmieniono w Postgres 11 . proisagg
został zastąpiony przez prokind
, dodano prawdziwe procedury składowane. Musisz się dostosować. Zobacz:
- Jak usunąć wszystkie moje funkcje w PostgreSQL?
Zwroty:
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);
Znaleziono cztery dopasowania w przykładzie, ponieważ dblink używa przeciążonych funkcji.
Uruchom DROP
wypowiedzi selektywnie!
Alternatywnie , możesz użyć wygodnego rzutowania na typ identyfikatora obiektu regprocedure
który zwraca pełną sygnaturę funkcji, w tym typy argumentów:
-- 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;