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 标准兼容,也允许编写所有参数数据类型(包括 OUT
参数的数据类型),而无需任何 argmode
标记。当这样做时,将针对命令验证存储过程的 OUT
参数的类型。 此规定产生歧义,即当参数列表不包含 argmode
标记时,不清楚预期使用哪个规则。DROP
命令将尝试两种方式的查找,如果找到两个不同的存储过程,则会抛出错误。为了避免这种歧义的风险,建议显式编写 IN
标记,而不是让它们默认为 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 扩展
该标准只允许每个命令删除一个存储过程。
IF EXISTS
选项是一个扩展。
指定参数模式和名称的功能是一个扩展,并且当给出模式时,查找规则会有所不同。
如果您在文档中发现任何不正确、与您特定功能的体验不符或需要进一步说明的地方,请使用此表单报告文档问题。