PostgreSQL 教程: 删除 PL/pgSQL 函数

八月 18, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的drop function语句删除函数。

DROP FUNCTION 语句简介

要删除用户定义的函数,请使用以下drop function语句:

drop function [if exists] function_name(argument_list)
[cascade | restrict]

在这个语法中:

  • 首先,在drop function关键字后指定要删除的函数的名称。
  • 其次,如果您希望指示 PostgreSQL 在函数不存在时发出通知而不是错误,请使用if exists选项。
  • 第三,指定函数的参数列表。由于函数可以重载,PostgreSQL 需要通过检查参数列表来知道要删除哪个函数。如果函数在模式中是唯一的,则无需指定参数列表。

当函数具有任何依赖对象(例如运算符或触发器)时,您不能删除该函数。

要删除函数及其依赖对象,您需要指定cascade选项。带有cascade选项的drop function将递归地删除该函数、其依赖对象以及依赖于这些对象的对象等等。

默认情况下,使用restrict选项的drop function语句在函数具有任何依赖对象时拒绝删除该函数。

要使用单个drop function语句删除多个函数,请在drop function关键字后面指定以逗号分隔的函数名称列表,如下所示:

drop function [if exists] function1, function2, ...;

删除函数示例

以下语句使用create function语句定义一个函数,该函数返回一组影片的信息,包括了film_idtitleactor列:

create or replace function get_film_actors()
	returns setof record
as $$
declare
   rec record;
begin
   for rec in select 
			film_id, 
			title, 
            (first_name || ' ' || last_name)::varchar
		from film
		inner join film_actor using(film_id)
		inner join actor using (actor_id)
		order by title
	loop
        return next rec;
	end loop;
	
	return;
end;
$$ 
language plpgsql;

以下语句定义了一个同名的get_film_actors函数。但是,它接受电影 ID 作为参数:

create or replace function get_film_actors(p_film_id int)
	returns setof record
as $$
declare
   rec record;
begin
   for rec in select 
			film_id, 
			title, 
            (first_name || ' ' || last_name)::varchar
		from film
		inner join film_actor using(film_id)
		inner join actor using (actor_id)
		where film_id = p_film_id
		order by title
	loop
        return next rec;
	end loop;
	
	return;
end;
$$ 
language plpgsql;

以下语句尝试删除get_film_actors函数:

drop function get_film_actors;

然而,PostgreSQL 发出了错误:

ERROR:  function name "get_film_actors" is not unique
HINT:  Specify the argument list to select the function unambiguously.
SQL state: 42725

由于get_film_actors函数不是唯一的,因此您需要指定要删除哪个函数。

以下语句删除具有零参数的get_film_actors函数:

drop function get_film_actors();

现在,只剩下一个get_film_actors函数了。由于它在数据库中是唯一的,因此您可以不指定其参数列表删除它,如下所示:

drop function get_film_actors;

或者,如果您想指定确定的函数,可以使用以下语句:

drop function get_film_actors(int);

概括

  • 使用drop function语句删除函数。

  • 如果函数重载了,请指定函数中的参数列表。

  • 使用带有cascade选项的drop function语句来删除函数、及其依赖对象,以及依赖于这些对象的对象,等等。