📜  PostgreSQL – 删除程序

📅  最后修改于: 2022-05-13 01:57:14.785000             🧑  作者: Mango

PostgreSQL – 删除程序

在 PostgreSQL 中, drop procedure语句删除了一个存储过程

Syntax:
drop procedure [if exists] procedure_name (argument_list)
[cascade | restrict]

我们来分析一下上面的语法:

  • 首先,drop procedure关键字后指定要删除的存储过程的名称 ( procedure_name )
  • 其次,如果您希望 PostgreSQL 在删除不存在的存储过程时发出通知而不是错误,请使用if exists选项。
  • 第三,如果存储过程的名称在数据库中不是唯一的,则指定存储过程的参数列表。请注意,具有不同参数列表的存储过程可以共享相同的名称。 PostgreSQL 需要参数列表来确定要删除哪个存储过程。
  • 最后,使用级联选项删除存储过程及其依赖对象以及依赖于这些对象的对象等。默认选项是受限制的,如果它有任何依赖对象,将拒绝删除存储过程。

要删除多个存储过程,请在 drop procedure 关键字后指定存储过程名称的逗号列表,如下所示:

Syntax:
drop procedure [if exists] name1, name2, ...;

作为示例,我们将在示例数据库(即 dvdrental)上创建一个存储过程。

让我们创建几个管理参与者的存储过程,以便您可以学习如何删除它们:



下列 insert_actor()存储过程将新行插入到actor表中。它接受两个参数,即演员的名字和姓氏。

create or replace procedure insert_actor(
    fname varchar, 
    lname varchar)
language plpgsql    
as $$
begin
    insert into actor(first_name, last_name)
    values('John', 'Doe');
end;
$$;

下面的insert_actor存储过程还将一行插入到actor表中。但是,它接受一个参数,即演员的全名。这 insert_actor()使用split_part()函数将全名拆分为名字和姓氏,然后将它们插入到演员表中。

create or replace procedure insert_actor(
    full_name varchar
)
language plpgsql    
as $$
declare
    fname varchar;
    lname varchar;
begin
    -- split the fullname into first & last name
    select 
        split_part(full_name, ' ', 1),
        split_part(full_name, ' ', 2)
    into fname,
         lname;
    
    -- insert first & last name into the actor table
    insert into actor(first_name, last_name)
    values('John', 'Doe');
end;
$$;

以下存储过程按 id删除一个参与者:

create or replace procedure delete_actor(
    p_actor_id int
)
language plpgsql
as $$
begin
    delete from actor 
    where actor_id = p_actor_id;
end; 
$$;

以下存储过程更新演员的名字和姓氏:

create or replace procedure update_actor(
    p_actor_id int,
    fname varchar,
    lname varchar
)
language plpgsql
as $$
begin
    update actor 
    set first_name = fname,
        last_name = lname
    where actor_id = p_actor_id;
end; 
$$;

例子:

首先,尝试删除 insert_actor存储过程:

drop procedure insert_actor;

输出:

因为有两个insert_actor存储过程,所以需要指定参数列表,以便 PostgreSQL 可以选择正确的存储过程进行删除。

其次,删除接受一个参数的insert_actor(varchar)存储过程:

drop procedure insert_actor(varchar);

由于insert_actor存储过程现在是唯一的,您可以在不指定参数列表的情况下删除它:

drop procedure insert_actor;

它与以下内容相同:

drop procedure insert_actor(varchar, varchar);

第三,使用单个drop procedure语句删除两个存储过程

drop procedure 
    delete_actor, 
    update_actor;

结论:

  • 使用drop procedure语句删除存储过程。
  • 删除过程关键字后指定逗号分隔的存储过程名称列表以删除多个存储过程。
  • 如果存储过程名称不唯一,请使用参数列表指定要删除的存储过程。