支持的版本: 当前 (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

参数的模式:INOUTINOUTVARIADIC。如果省略,则默认为 IN(但请参见下文)。

argname

参数的名称。请注意,DROP PROCEDURE 实际上并不关注参数名称,因为仅使用参数数据类型来确定过程的标识。

argtype

过程参数的数据类型(可选地包含模式限定),如果有的话。有关详细信息,请参见下文。

CASCADE

自动删除依赖于该过程的对象,并依次删除依赖于这些对象的所有对象(请参见第 5.15 节)。

RESTRICT

如果有任何对象依赖于该过程,则拒绝删除该过程。这是默认设置。

注释

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

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

为了与 SQL 标准兼容,还允许编写所有参数数据类型(包括 OUT 参数的数据类型),而无需任何 argmode 标记。当这样做时,将根据命令验证过程的 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 扩展

  • 标准只允许每个命令删除一个过程。

  • IF EXISTS 选项是一个扩展。

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

提交更正

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