# 丢弃程序

DROP PROCEDURE — 删除一个过程

# 概要

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

# 描述

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

# 参数

如果存在

如果过程不存在,不要抛出错误。在这种情况下发出通知。

姓名

现有过程的名称(可选模式限定)。

参数模式

参数的模式:,出去,进出, 或者杂音.如果省略,则默认为(但见下文)。

参数名称

参数的名称。注意丢弃程序实际上并不关注参数名称,因为只有参数数据类型用于确定过程的标识。

参数类型

过程参数的数据类型(可选模式限定),如果有的话。详情见下文。

级联

自动删除依赖于过程的对象,进而删除依赖于这些对象的所有对象(请参阅第 5.14 节)。

严格

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

# 笔记

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

在 PostgreSQL 中,列出输入(包括进出) 参数,因为不允许两个同名例程共享相同的输入参数列表。此外,降低命令实际上不会检查您是否编写了出去正确论证;所以任何明确标记的参数出去只是噪音。但是为了与相应的一致性,建议编写它们创造命令。

为了与 SQL 标准兼容,还允许编写所有参数数据类型(包括出去论据)没有任何*参数模式标记。完成后,程序的类型出去论据将要根据命令进行验证。该规定产生了歧义,因为当参数列表不包含参数模式*标记,不清楚是哪条规则。这降低命令将尝试双向查找,如果找到两个不同的过程将抛出错误。为了避免这种模棱两可的风险,建议写显式标记而不是让它们被默认,从而强制使用传统的 PostgreSQL 解释。

刚才解释的查找规则也被其他作用于现有过程的命令使用,例如改变程序对程序的评论.

# 例子

如果只有一个程序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 扩展:

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

  • 如果存在选项是一个扩展。

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

# 也可以看看

创建过程,改变程序,拖放功能,放弃常规