DROP PROCEDURE
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
过程参数的数据类型(可选的模式限定),如果有的话。有关详细信息,请参见下文。
级联
自动删除依赖于该过程的对象,进而删除所有依赖于这些对象的其它对象(请参阅第 5.14 节)。
限制
如果任何对象依赖于该过程,则拒绝删除该过程。这是默认设置。
备注
如果给定名称的过程只有一个,则可以省略参数列表。在这种情况下,也省略括号。
在PostgreSQL中,列出输入(包括INOUT
)参数就足够了,因为不允许两个同名例程共享相同的输入参数列表。此外,DROP
命令实际上不会检查您是否正确编写了OUT
参数的类型;因此,任何明确标记为OUT
的参数都是噪音。但建议编写它们,以与相应的CREATE
命令保持一致。
为了与 SQL 标准兼容,还可以编写所有参数数据类型(包括OUT
参数的类型),而无需任何*argmode
标记。执行此操作时,过程的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扩展
该标准只允许每个命令删除一个过程。
IF EXISTS
选项是一个扩展。指定参数模式和名称的能力是一个扩展,并且在给出模式时,查找规则有所不同。