Redrock Postgres 搜索 英文
版本: 11 / 12 / 13 / 14 / 15 / 16 / 17

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 节)。

限制

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

注解

如果仅存在一个指定名称的过程,则可以省略自变量列表。在这种情况下,也省略掉括号。

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

  • 可指定自变量模式和名称的能力是一个扩展,并且在指定模式时查找规则有所不同。

另请参阅

CREATE PROCEDUREALTER PROCEDUREDROP FUNCTIONDROP ROUTINE