批量删除函数

假设您有一堆需要删除的函数——没有简单的SQL命令可以做到这一点,但是很容易编写一个PL/pgSQL代码片段来动态生成相应的语句。

关键在于使用pg_get_function_arguments()函数,该函数将为每个函数生成适当的参数,然后可以将其传递给DROP FUNCTION命令。

    DO
    $$
      DECLARE
        rec RECORD;
      BEGIN
        FOR rec IN
           SELECT n.nspname || '.' || p.proname || '(' || pg_catalog.pg_get_function_arguments(p.oid)  ||')' AS func
             FROM pg_catalog.pg_proc p
        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
            WHERE p.proname LIKE 'foo%'
        LOOP
          RAISE NOTICE 'Dropping: %', rec.func;
          EXECUTE 'DROP FUNCTION ' || rec.func;
        END LOOP;
      END;
    $$;

给定以下函数

postgres# \df foo
                       List of functions
 Schema | Name | Result data type | Argument data types | Type 
--------+------+------------------+---------------------+------
 public | foo  | integer          | integer             | func
 public | foo  | integer          | integer, integer    | func
(2 rows)

执行上述代码片段的结果是

postgres# DO
$$
...
$$;
NOTICE:  Dropping: public.foo(integer)
NOTICE:  Dropping: public.foo(integer, integer)

此技术可用于执行其他批量操作,例如更改所有权(但也请参见REASSIGN OWNED)。