2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11

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 PROCEDURECOMMENT 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 选项是扩展功能。

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

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。