DROP PROCEDURE — 删除一个过程
DROP PROCEDURE [ IF EXISTS ]name[ ( [ [argmode] [argname]argtype[, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]
DROP PROCEDURE 删除一个或多个现有过程的定义。要执行此命令,用户必须是这些过程的所有者。通常必须指定过程的参数类型,因为可能存在多个名字相同但参数列表不同的过程。
IF EXISTS如果该过程不存在,则不抛出错误,此时会发出一个提示。
name一个现有过程的名称(可以用模式限定)。
argmode 参数的模式:IN、OUT、INOUT 或 VARIADIC。如果省略,默认为 IN(但参见下文)。
argname 参数的名称。注意,DROP PROCEDURE 实际上并不关注参数的名称,因为只有参数的数据类型才被用来确定过程的身份。
argtype过程各参数(如果有的话)的数据类型(可以用模式限定)。详情参见下文。
CASCADE自动删除依赖于该过程的对象,进而删除依赖于这些对象的所有对象(参见 Section 5.15)。
RESTRICT如果有任何对象依赖于该过程,则拒绝删除该过程。这是默认值。
如果具有给定名字的过程只有一个,则可以省略参数列表。在这种情况下,也应该省略圆括号。
在 PostgreSQL 中,只要列出输入参数(包括 INOUT 参数)就足够了,因为不允许两个同名的例程共享相同的输入参数列表。此外,DROP 命令实际上并不会检查你书写的 OUT 参数类型是否正确,因此任何被显式标记为 OUT 的参数都只是噪声。但为了与相应的 CREATE 命令保持一致,建议把它们写出来。
为了与 SQL 标准兼容,也允许书写全部参数的数据类型(包括 OUT 参数的类型)而不带任何 argmode 标记。此时,过程的 OUT 参数的类型将会根据该命令进行验证。这一规定带来了一种歧义:当参数列表中不含 argmode 标记时,无法弄清想使用的是哪条规则。DROP 命令会按两种方式都尝试查找,如果找到了两个不同的过程,就会抛出一个错误。为了避免这种歧义的风险,建议显式地写出 IN 标记,而不是让它们取默认值,从而强制使用传统的 PostgreSQL 解释。
刚刚解释的查找规则也被其他作用于现有过程的命令使用,例如 ALTER PROCEDURE 和 COMMENT ON PROCEDURE。
如果名为 do_db_maintenance 的过程只有一个,这条命令就足以删除它:
DROP PROCEDURE do_db_maintenance;
给定这样的过程定义:
CREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...
下面任何一条命令都可以删除它:
DROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text); DROP PROCEDURE do_db_maintenance(IN text, OUT text); DROP PROCEDURE do_db_maintenance(IN text); DROP PROCEDURE do_db_maintenance(text); DROP PROCEDURE do_db_maintenance(text, text); -- potentially ambiguous
但是,如果同时还存在例如这样的过程定义:
CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...
,那么最后一个例子就会产生歧义。
该命令符合 SQL 标准,并有以下 PostgreSQL 扩展:
标准只允许每条命令删除一个过程。
IF EXISTS 选项是一种扩展。
指定参数模式和参数名称的能力是一种扩展,并且在给定了模式时查找规则会有所不同。