删除 DB2 上的非唯一过程

Deleting a non-unique procedure on DB2

在我尝试使用行编辑程序时

CREATE OR DROP PROCEDURE

我创建了两个同名程序,如何删除它们?

每当我尝试删除它时收到的错误是

Reference to Rountine BT_CU_ODOMETER was made without a signature, but the routine is not unique in its schema. SQLSTATE = 42725

我正在使用 DB2

一个过程可以像这样被删除:

删除程序 INORUP 限制; 参数 RESTRICT 是必需的。它避免丢弃触发器使用的过程。程序包被丢弃。 调用该过程的包和计划已失效。

假设这是 DB2 for LUW。

DB2 允许您"overload" 具有相同名称但参数数量不同的程序。每个程序都有一个特定名称,可以由您提供或由系统生成,并且是唯一的。

要确定您的程序的具体名称,运行

SELECT ROUTINESCHEMA, ROUTINENAME, SPECIFICNAME FROM SYSCAT.ROUTINES
WHERE ROUTINENAME = 'BT_CU_ODOMETER'

然后您可以单独删除每个过程:

DROP SPECIFIC PROCEDURE <specific name>

问题

当创建多个具有相同名称但参数数量不同的存储过程时,存储过程被视为重载。尝试使用 DROP PROCEDURE 语句删除重载的存储过程时,可能会导致以下错误:

db2 drop procedure SCHEMA.PROCEDURENAME 

DB21034E 该命令作为 SQL 语句处理,因为它不是有效的命令行处理器命令。在 SQL 处理期间,它返回: SQL0476N 对例程 "SCHEMA.PROCEDURENAME" 的引用没有签名,但例程在其模式中不是唯一的。 SQL状态=42725

原因

返回错误是因为存储过程过载,因此该过程在该架构中不是唯一的。要删除该过程,您必须指定在 CREATE PROCEDURE 语句中指定的数据类型,或者根据以下示例使用存储过程的特定名称。

解决方案

为了删除重载的存储过程,您可以使用以下任一语句:

 db2 "DROP PROCEDURE procedure-name(int, varchar(12))" 
 db2 "DROP SPECIFIC PROCEDURE specific-name" 

注意:可以通过从 syscat.routines 目录视图中选择 SPECIFICNAME 列来识别特定名称。

如果您需要删除 所有 给定过程名称的重载,这里有一个基于

的方便脚本
BEGIN
  FOR rec AS 
    SELECT SPECIFICNAME, ROUTINETYPE
    FROM SYSCAT.ROUTINES
    WHERE ROUTINENAME = 'ROUTINE_NAME'
  DO
    IF rec.ROUTINETYPE = 'P' THEN
      EXECUTE IMMEDIATE 'DROP SPECIFIC PROCEDURE ' || rec.SPECIFICNAME;
    ELSE
      EXECUTE IMMEDIATE 'DROP SPECIFIC FUNCTION ' || rec.SPECIFICNAME;
    END IF;
  END FOR;
END