DROP PROCEDURE

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

自动删除依赖于该存储过程的对象,以及反过来依赖于这些对象的所有对象(参见 第 5.15 节)。

RESTRICT

如果任何对象依赖于该存储过程,则拒绝删除它。这是默认行为。

注释

如果具有给定名称的存储过程只有一个,则可以省略参数列表。在这种情况下也省略括号。

在 PostgreSQL 中,列出输入(包括 INOUT)参数就足够了,因为不允许同名的例程共享相同的输入参数列表。此外,DROP 命令实际上不会检查您是否正确编写了 OUT 参数的类型;因此,任何明确标记为 OUT 的参数都只是无关紧要的。但建议写上它们,以与相应的 CREATE 命令保持一致。

为了兼容 SQL 标准,也可以在没有 argmode 标记的情况下编写所有参数数据类型(包括 OUT 参数的)。执行此操作时,将 验证 存储过程的 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 扩展

  • SQL 标准只允许一次删除一个存储过程。

  • IF EXISTS 选项是扩展功能。

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