PostgreSQL – 删除函数
在 PostgreSQL 中,Drop函数语句用于删除一个函数。
Syntax:
drop function [if exists] function_name(argument_list)
[cascade | restrict]
我们来分析一下上面的语法:
- 首先,在drop函数关键字后指定要删除的函数的名称。
- 其次,如果您想指示 PostgreSQL 在函数不存在的情况下发出通知而不是错误,请使用if exists选项。
- 第三,指定函数的参数列表。由于函数可以重载,PostgreSQL 需要通过检查参数列表来知道要删除哪个函数。如果函数在架构中是唯一的,则不需要指定参数列表。
当函数具有任何依赖对象(例如运算符或触发器)时,您不能删除该函数。要删除函数及其依赖对象,您需要指定级联选项。带有级联选项的 drop函数将递归删除函数、它的依赖对象以及依赖于这些对象的对象,等等。
默认情况下,drop 函数语句使用restrict 选项拒绝删除具有任何依赖对象的函数。要使用单个 drop 函数语句删除多个函数,请在 drop 函数关键字后指定一个以逗号分隔的函数名称列表,如下所示:
drop function [if exists] function1, function2, ...;
作为示例,我们将使用示例数据库,即 dvdrental。
例子 :
以下语句使用 create 函数语句定义一个函数,该函数返回一组电影,包括film_id 、 title和actor :
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_fiml_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_fiml_id
order by title
loop
return next rec;
end loop;
return;
end;
$$
language plpgsql;
以下语句尝试删除get_film_actors函数:
drop function get_film_actors;
输出:
由于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 函数语句删除一个函数。
- 如果函数重载,请在函数指定参数列表。
- 使用带有级联选项的drop 函数语句来删除函数及其从属对象和依赖于这些对象的对象,依此类推。