Postgres memiliki fungsi khusus untuk tujuan itu. Diperkenalkan dengan Postgres 8.4. Panduan:
pg_get_function_identity_arguments(func_oid)
... dapatkan daftar argumen untuk mengidentifikasi fungsi (tanpa nilai default) ...
pg_get_function_identity_arguments
mengembalikan daftar argumen yang diperlukan untuk mengidentifikasi suatu fungsi, dalam bentuk yang diperlukan untuk muncul di dalamALTER FUNCTION
, misalnya. Formulir ini menghilangkan nilai default.
Menggunakan itu (dan format()
, diperkenalkan dengan Postgres 9.1), kueri berikut menghasilkan pernyataan DDL untuk menghapus fungsi yang cocok dengan istilah pencarian Anda:
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 sistem pg_proc
diubah di Postgres 11 . proisagg
digantikan oleh prokind
, prosedur tersimpan yang sebenarnya telah ditambahkan. Anda perlu beradaptasi. Lihat:
- Bagaimana cara menghapus semua fungsi saya di PostgreSQL?
Pengembalian:
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);
Ditemukan empat kecocokan dalam contoh karena dblink menggunakan fungsi kelebihan beban.
Jalankan DROP
pernyataan secara selektif!
Alternatif , Anda dapat menggunakan pemeran yang nyaman untuk jenis pengenal objek regprocedure
yang mengembalikan tanda tangan fungsi lengkap termasuk tipe argumen:
-- 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;