PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

DROP PROCEDURE

DROP PROCEDURE — 删除一个过程

Synopsis

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 选项是一种扩展。

  • 指定参数模式和参数名称的能力是一种扩展,并且在给定了模式时查找规则会有所不同。

另请参阅

CREATE PROCEDURE, ALTER PROCEDURE, DROP FUNCTION, DROP ROUTINE