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