【问题标题】:Deleting a non-unique procedure on DB2删除 DB2 上的非唯一过程
【发布时间】:2016-08-25 03:08:51
【问题描述】:

在我尝试使用该行编辑过程时

CREATE OR DROP PROCEDURE

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

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

对 Routine BT_CU_ODOMETER 的引用没有签名,但该例程在其架构中不是唯一的。 SQLSTATE = 42725

我正在使用 DB2

【问题讨论】:

  • 什么 DB2 版本/平台?
  • "create or drop" 对我来说没有任何意义。您的意思是“创建或替换”吗?
  • 是的,抱歉创建或替换。

标签: sql db2 procedure


【解决方案1】:

假设这是 DB2 for LUW。

DB2 允许您“重载”具有相同名称但参数数量不同的过程。每个过程都会收到一个特定名称,该名称可由您提供或由系统生成,并且是唯一的。

要确定过程的具体名称,请运行

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

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

DROP SPECIFIC PROCEDURE <specific name>

【讨论】:

    【解决方案2】:

    如果您需要删除所有给定过程名称的重载,这里有一个基于mustaccio's answer的方便脚本

    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
    

    【讨论】:

      【解决方案3】:

      问题

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

      db2 drop procedure SCHEMA.PROCEDURENAME 
      

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

      原因

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

      解决方案

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 不是他有两个同名的问题——你必须删除它的对象ID。
        猜你喜欢
        • 2012-07-26
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        相关资源
        最近更新 更多