Postgres ma dedykowaną funkcję do tego celu. Wprowadzono za pomocą Postgres 8.4. The manual:
pg_get_function_identity_arguments(func_oid)
... dostać listę argumentów do identyfikacji funkcji (bez wartości domyślnych) ...
pg_get_function_identity_arguments
zwraca listę argumentów niezbędne do określenia funkcji w postaci musiałaby pojawiać się na przykład w obrębie ALTER FUNCTION
. Ta forma pomija wartości domyślne.
Korzystanie że (i format()
, wprowadzony z PostgreSQL 9.1), następujące zapytanie generuje DDL do spadku funkcji spełniających warunki wyszukiwania:
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;
Powroty:
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 dopasowuje w przykładzie, ponieważ dblink używa overloaded functions.
Wykonywanie instrukcji DROP
wybiórczo!
Alternatywnie, można skorzystać z wygodnego obsady do object identifier type regprocedure
która zwraca pełną sygnaturę funkcji w tym rodzaju 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;
Sprawdź funkcję za pomocą pgAdmin. –
'\ df name' inside [' psql'] (http: //www.postgresql.org/docs/current/static/app-psql.html). –