PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

DROP FUNCTION mà không cần biết số lượng / loại tham số?

Truy vấn cơ bản

Truy vấn này tạo tất cả các câu lệnh DDL cần thiết:

SELECT 'DROP FUNCTION ' || oid::regprocedure
FROM   pg_proc
WHERE  proname = 'my_function_name'  -- name without schema-qualification
AND    pg_function_is_visible(oid);  -- restrict to current search_path

Đầu ra:

DROP FUNCTION my_function_name(string text, form text, maxlen integer);
DROP FUNCTION my_function_name(string text, form text);
DROP FUNCTION my_function_name(string text);

Thực hiện các lệnh sau khi kiểm tra tính hợp lý.

Chuyển tên hàm phân biệt chữ hoa chữ thường và không thêm dấu ngoặc kép để khớp với pg_proc.proname .

Truyền tới loại định danh đối tượng regprocedure ( oid::regprocedure ), rồi đến text ngầm định, tạo ra các tên hàm với các loại đối số, tự động được trích dẫn kép và đủ điều kiện giản đồ theo search_path hiện tại Khi cần thiết. Không đưa vào SQL có thể.

pg_function_is_visible(oid) giới hạn lựa chọn đối với các chức năng trong search_path hiện tại ("có thể nhìn thấy"). Bạn có thể muốn hoặc không muốn điều này.

Nếu bạn có nhiều hàm cùng tên trong nhiều lược đồ hoặc các hàm được nạp chồng với các đối số hàm khác nhau, tất cả trong số đó sẽ được liệt kê riêng. Bạn có thể muốn hạn chế đối với (các) lược đồ cụ thể hoặc (các) tham số hàm cụ thể.

Có liên quan:

  • Khi nào / như thế nào thì các hàm biểu thức giá trị mặc định bị ràng buộc liên quan đến đường dẫn tìm kiếm?

Chức năng

Bạn có thể tạo plpgsql chức năng xung quanh điều này để thực thi các câu lệnh ngay lập tức với EXECUTE . Đối với Postgres 9.1 hoặc sau này: Cẩn thận! Nó làm giảm các chức năng của bạn!

CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT functions_dropped int)
   LANGUAGE plpgsql AS
$func$
-- drop all functions with given _name in the current search_path, regardless of function parameters
DECLARE
   _sql text;
BEGIN
   SELECT count(*)::int
        , 'DROP FUNCTION ' || string_agg(oid::regprocedure::text, '; DROP FUNCTION ')
   FROM   pg_catalog.pg_proc
   WHERE  proname = _name
   AND    pg_function_is_visible(oid)  -- restrict to current search_path
   INTO   functions_dropped, _sql;     -- count only returned if subsequent DROPs succeed

   IF functions_dropped > 0 THEN       -- only if function(s) found
     EXECUTE _sql;
   END IF;
END
$func$;

Gọi:

SELECT f_delfunc('my_function_name');

Hàm trả về số lượng hàm được tìm thấy và bị loại bỏ nếu không có ngoại lệ nào được nêu ra. 0 nếu không tìm thấy.

Đọc thêm:

  • Cách search_path ảnh hưởng đến độ phân giải của mã định danh và "giản đồ hiện tại"
  • Cắt bớt tất cả các bảng trong cơ sở dữ liệu Postgres
  • Thứ tự theo / giới hạn được tham số hóa PostgreSQL trong hàm bảng

Đối với các phiên bản Postgres cũ hơn 9.1 hoặc các biến thể cũ hơn của hàm bằng cách sử dụng regprocpg_get_function_identity_arguments(oid) kiểm tra lịch sử chỉnh sửa của câu trả lời này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn đệ quy được sử dụng để đóng bắc cầu

  2. 3 cách liệt kê tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu PostgreSQL

  3. Trừ các tháng cho một ngày trong PostgreSQL

  4. PostgreSQL, trạng thái SQL:42601

  5. Tổng quan về bộ nhớ đệm cho PostgreSQL