PostgreSQL 删除函数

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

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

PostgreSQL Drop Function 语句介绍

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

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

在这个语法中:

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

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

要删除函数及其依赖对象,您需要指定 cascade 选项。在 drop function 与 cacade 选项将递归删除功能,它依赖的对象,并依赖于这些对象的对象,依此类推。

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

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

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

PostgreSQL Drop 函数示例

下面的语句使用 create function 语句来定义一个返回一组影片包括功能 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;

但是,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 语句删除函数。
  • 如果函数重载,请在函数中指定参数列表。
  • 使用 drop function 带有 cascade 选项的语句来删除函数及其从属对象和依赖于这些对象的对象,依此类推。