删除 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
在我尝试使用行编辑程序时
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