2016-04-21 93 views
0

我有这个Oracle查询在一个环境中运行良好,并在其他环境中发生错误。两个环境都有完全相似的数据库。Oracle 11g - 查询时出错

DECLARE 
    v_temp NUMBER(1,0) := 0; 
    BEGIN 
    BEGIN 
    SELECT 1 INTO v_temp FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_PDUCRC_MtrPrgAssc';   
    EXCEPTION WHEN NO_DATA_FOUND THEN v_temp := 0; 
END; 

IF v_temp = 0 THEN 
    BEGIN 
     EXECUTE IMMEDIATE 'ALTER TABLE METERCONFIGPDUCRC 
          ADD CONSTRAINT FK_PDUCRC_MtrPrgAssc 
          FOREIGN KEY (MeterProgramAssocID) 
          REFERENCES MeterProgramAssoc(MeterProgramAssocID)'; 
    END; 
END IF; 
END; 

错误是 -

这样的引用约束已经存在于表。

请帮我解决这个问题。

+2

也许问题是你正在检查约束的存在与大小写?尝试使用upper(constraint_name)= upper('...') – Aleksej

+1

完全相似的数据库我最喜欢的类型。 :P FK_PDUCRC_MTRPRGASSOC已经存在于'失败的环境中吗? '从all_Constraints中选择*其中constraint_Name ='FK_PDUCRC_MTRPRGASSC'在环境上失败......如果记录返回...它已经存在并且错误是正确的。 – xQbert

+0

我无法在查询中进行更改,因为它存在于我们的客户端版本中。在oracle数据库中有没有可以解决这种大小写混淆的参数或设置? – VIVEK

回答

0

假设你不想创建具有相同名称的限制,但不同的情况下,你可以尝试检查约束的处理上存在/小写:

DECLARE 
    v_temp NUMBER(1,0) := 0; 
    BEGIN 
    BEGIN 
     SELECT 1 INTO v_temp FROM USER_CONSTRAINTS WHERE upper(CONSTRAINT_NAME) = upper('FK_PDUCRC_MtrPrgAssc');   
     EXCEPTION 
     WHEN NO_DATA_FOUND 
      THEN v_temp := 0; 
    END; 

    IF v_temp = 0 THEN 
    BEGIN 
     EXECUTE IMMEDIATE 'ALTER TABLE METERCONFIGPDUCRC 
          ADD CONSTRAINT FK_PDUCRC_MtrPrgAssc 
          FOREIGN KEY (MeterProgramAssocID) 
          REFERENCES MeterProgramAssoc(MeterProgramAssocID)'; 
    END; 
    END IF; 
END; 
0

错误消息不听起来像NAME那样的约束是问题。错误并不表示同名的约束已经存在;它表示该表中已经存在引用约束。

运行DESCRIBE METERCONFIGPDUCRC并查看您是否已尝试添加FK约束的列上有外键约束。 (形容一个sqlplus的命令,它是由SQL Developer和蟾蜍理解;使用任何等价工具,你可能在你的界面。)

0

看来MeterProgramAssocID已经做了一个外键参照MeterProgramAssoc(MeterProgramAssocID)用不同的约束名称。检查这种约束是否已经存在。

SELECT A.CONSTRAINT_NAME FROM USER_CONSTRAINTS A,USER_CONS_COLUMNS B WHERE A.CONSTRAINT_TYPE ='R'AND A.TABLE_NAME ='METERCONFIGPDUCRC'AND A.OWNER = AND A.OWNER = B.OWNER AND A.CONSTRAINT_NAME = B. CONSTRAINT_NAME AND A.TABLE_NAME = B.TABLE_NAME AND B.COLUMN_NAME = UPPER('MeterProgramAssocID')

上面的查询应该给你现有的约束名称。希望这可以帮助。