PostgreSQL 教程: 删除 PL/pgSQL 存储过程

八月 18, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的 drop procedure 语句来删除存储过程。

DROP PROCEDURE 语句简介

drop procedure语句删除一个存储过程。下面说明了drop procedure语句的语法:

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

在这个语法中:

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

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

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

创建示例存储过程

让我们创建几个管理演员的存储过程,以便您可以了解如何删除它们:

img

以下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表中。然而,它接受一个参数,即演员的全名。在将全名插入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;

PostgreSQL 发出以下错误:

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

因为有两个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语句删除存储过程。

  • drop procedure关键字后面指定以逗号分隔的存储过程名称列表,删除多个存储过程。

  • 如果存储过程名称不唯一,请使用参数列表指定要删除的存储过程。