限制

您无法从相同的 SPL 例程内删除 SPL 例程。

您不能使用 DROP ROUTINE 、DROP FUNCTION 或 DROP PROCEDURE 语句删除受保护的例程。有关受保护例程的更多信息,请参阅 GBase 8s SQL 参考指南 中系统目录表 sysprocedures 的描述。

要使用 DROP ROUTINE 语句注销 UDR,UDR 的类型不能含糊不清。您指定的 UDR 的名称必须引用用户定义的函数或用户定义的过程。如果存在以下任何一个条件,则数据库服务器会返回一个错误:

如果例程名称在数据库内不唯一,则您必须指定足够的 parameter_type 信息以区分这些名称。如果数据库服务器无法解析一个意义含糊的 UDR 名称,即它的签名与另一个 UDR 的签名只是在一个未命名的 ROW 类型参数中不同,则返回一个错误。(当定义了含义模糊的 functionprocedure 时,数据库服务器不能预期此错误。)

如果使用参数类型来标识 UDR,则这些参数数据类型应跟在 UDR 名称后面,如下例所示:
DROP ROUTINE compare(INT, INT);
如果您对 UDR 使用特定的名称,则必须包含关键字 SPECIFIC ,如下例所示:
DROP SPECIFIC ROUTINE compare_point;

如果您包含了可选的 IF EXISTS 关键字,则如果数据库服务器在当前数据库中没有找到与 DROP ROUTINE 语句指定的相符合的函数则数据库不采取任何操作(而不是发出错误)。

确定例程是否存在

在您尝试删除用户定义的例程之前,可以通过查询系统目录来检查此例程是否在数据库中存在。以下示例中,SELECT 语句从 sysprodures 表中检索标识为 MyRoutine 的任何例程:
SELECT * FROM sysprocedures WHERE procname = MyRoutine;
        
如果此查询返回一行,则名为 MyRoutine 的 UDR 注册在当前数据库中。

如果没有返回行,则您无需发出 DROP ROUTINE 语句,但是您可能希望验证 WHERE 子句指定的名称是否正确,以及您是否连接到正确的数据库。

如果此查询返回多行,则在当前数据库中重载例程 MyRoutine ,并且您需要检查 MyRoutine 例程的属性以确定它们中的哪些(如果有)需要通过 DROP ROUTINE 语句注销。