Postgresにはその目的のための専用機能があります。 Postgres8.4で導入されました。マニュアル:
pg_get_function_identity_arguments(func_oid)
...関数を識別するための引数リストを取得します(デフォルト値なし)...
pg_get_function_identity_arguments
関数を識別するために必要な引数リストを、ALTER FUNCTION
内に表示する必要がある形式で返します。 、 例えば。このフォームではデフォルト値が省略されています。
それを使用する(およびformat()
、Postgres 9.1で導入された)、次のクエリは、検索語に一致する関数を削除するためのDDLステートメントを生成します。
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;
システムカタログpg_proc
Postgres 11で変更されました 。 proisagg
prokind
に置き換えられました 、真のストアドプロシージャが追加されました。あなたは適応する必要があります。参照:
- PostgreSQLですべての関数を削除するにはどうすればよいですか?
返品:
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);
dblinkはオーバーロードされた関数を使用しているため、例で4つの一致が見つかりました。
DROP
を実行します ステートメントを選択的に!
または 、オブジェクト識別子タイプ regprocedure
への便利なキャストを使用できます これは、引数タイプを含む完全な関数シグネチャを返します:
-- 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;