批量删除函数

假设您有一堆需要删除的函数 - 没有简单的 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)。