Postgresql 中文操作指南

DROP PROCEDURE

DROP PROCEDURE — 删除过程

Synopsis

DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]

Description

DROP PROCEDURE 删除一个或多个现有过程的定义。要执行此命令,用户必须是该过程的所有者。通常必须指定过程中参数类型,因为可能存在具有相同名称和不同参数列表的多个不同过程。

Parameters

  • IF EXISTS

    • 如果该过程不存在,不要抛出一个错误。在这种情况下,将会发出一个通知。

  • name

    • 现有过程的名称(可选地经过架构限定)。

  • argmode

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

  • argname

    • 一个参数的名称。请注意, DROP PROCEDURE 实际上并不会注意参数名称,因为只有参数数据类型会被用来确定该过程的身份。

  • argtype

    • 该过程的参数(可选地经过架构限定)的数据类型(如果存在)。有关详细信息,请见下文。

  • CASCADE

    • 自动删除依赖于该过程的对象,以及反过来依赖于这些对象的全部对象(见 Section 5.14 )。

  • RESTRICT

    • 如果任意对象依赖于该过程,则拒绝删除该过程。这是一个默认值。

Notes

如果只存在一个指定名称的过程,则可以省略参数列表。此时,也省略掉括号。

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

为了与 SQL 标准兼容,还允许编写所有参数数据类型(包括 OUT 参数的数据类型),而没有任何 argmode 标记。完成之时的过程 OUT 参数 will 类型将被针对该命令进行验证。此规定会产生歧义,因为当参数列表不包含任何 argmode 标记时,则不清楚打算使用哪条规则。 DROP 命令将尝试通过两种方式进行查找,如果找到两个不同的过程,它会抛出一个错误。为了避免出现此类歧义的风险,建议明确编写 IN 标记而不是让它们默认化,从而强制使用传统的 PostgreSQL 解释。

刚解释过的查找规则也被会对现有的过程发起操作的其他命令使用,例如 ALTER PROCEDURECOMMENT ON PROCEDURE

Examples

如果只存在一个过程 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) ...

Compatibility

此命令符合 SQL 标准,带有以下 PostgreSQL 扩展: