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 PROCEDURE
和 COMMENT 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
选项是扩展功能。
指定参数模式和名称的功能是扩展功能,并且在给出模式时查找规则会有所不同。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。