Postgresql 中文操作指南
Synopsis
DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
[ CASCADE | RESTRICT ]
Description
DROP PROCEDURE 删除一个或多个现有过程的定义。要执行此命令,用户必须是该过程的所有者。通常必须指定过程中参数类型,因为可能存在具有相同名称和不同参数列表的多个不同过程。
Parameters
-
IF EXISTS
-
如果该过程不存在,不要抛出一个错误。在这种情况下,将会发出一个通知。
-
-
name
-
现有过程的名称(可选地经过架构限定)。
-
-
argmode
-
一个参数的模式: IN 、 OUT 、 INOUT 或 VARIADIC 。如果省略,则默认为 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 PROCEDURE 和 COMMENT 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) ...