Postgres にはそのための専用機能があります。Postgres 8.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;
Postgres 11でシステム カタログpg_proc
が変更されました。に置き換えられ、真のストアド プロシージャが追加されました。適応する必要があります。見る:proisagg
prokind
戻り値:
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;