Postgres có một chức năng dành riêng cho mục đích đó. Được giới thiệu với Postgres 8.4. Hướng dẫn sử dụng:
pg_get_function_identity_arguments(func_oid)
... lấy danh sách đối số để xác định một hàm (không có giá trị mặc định) ...
pg_get_function_identity_arguments
trả về danh sách đối số cần thiết để xác định một hàm, ở dạng nó sẽ cần xuất hiện bên trongALTER FUNCTION
, ví dụ. Biểu mẫu này bỏ qua các giá trị mặc định.
Sử dụng (và format()
đó , được giới thiệu với Postgres 9.1), truy vấn sau tạo các câu lệnh DDL để thả các hàm phù hợp với cụm từ tìm kiếm của bạn:
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;
Danh mục hệ thống pg_proc
đã thay đổi trong Postgres 11 . proisagg
đã được thay thế bởi prokind
, các thủ tục được lưu trữ thực sự đã được thêm vào. Bạn cần phải thích nghi. Xem:
- Làm cách nào để loại bỏ tất cả các chức năng của tôi trong PostgreSQL?
Lợi nhuận:
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);
Tìm thấy bốn kết quả phù hợp trong ví dụ vì dblink sử dụng các hàm quá tải.
Chạy DROP
tuyên bố một cách chọn lọc!
Ngoài ra , bạn có thể sử dụng truyền thuận tiện cho loại định danh đối tượng regprocedure
trả về một chữ ký hàm hoàn chỉnh bao gồm các loại đối số:
-- 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;