Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果Oracle中不存在,则等同于?_Oracle_Exists - Fatal编程技术网

如果Oracle中不存在,则等同于?

如果Oracle中不存在,则等同于?,oracle,exists,Oracle,Exists,以下语句适用于MSSQL: IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[FK_StationObjectsID]') AND parent_object_id = OBJECT_ID(N'[Attendance]')) BEGIN ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (Stat

以下语句适用于MSSQL:

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[FK_StationObjectsID]') AND parent_object_id = OBJECT_ID(N'[Attendance]'))
BEGIN
    ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)
END
在Oracle中,我尝试过:

IF NOT EXISTS (SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_STATIONOBJECTSID' AND TABLE_NAME = 'ATTENDANCE') THEN
BEGIN
    ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid);
END;

但是它给了我一个错误PLS-00103“遇到符号‘ALTER’…”

使用execute immediate在PLSQL块内触发ddl:

IF <condition> THEN 
    Execute immediate 'ALTER TABLE . . .';
END if;
更简单的方法是:

declare
  n int := 0;
begin
  select count(*) into n
  from user_constraints
  where constraint_name = 'FK_STATIONOBJECTSID'
  and table_name = 'ATTENDANCE';
  if n = 0 then
    execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
  end if;
end;
/

-

让它工作了,但可能不是最好的解决方案:

DECLARE
  foreign_key_exists number := 0;  
BEGIN
  SELECT COUNT(*) INTO foreign_key_exists FROM USER_CONSTRAINTS WHERE upper(CONSTRAINT_NAME) = upper('FK_StationObjectsID') AND upper(TABLE_NAME) = upper('Attendance');
  IF (foreign_key_exists = 0) 
    THEN
      EXECUTE IMMEDIATE 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
  END IF;
END;
/
您可以在SQL查询中使用,但不能像您尝试的那样在PLSQL条件中使用

您可能需要以下各项:

declare
    vCheck number;
begin
    select count(1)
    into vCheck
    from user_constraints
    where constraint_name = 'FK_STATIONOBJECTSID'
      and table_name = 'ATTENDANCE';
    --
    if vCheck = 0 then
        execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
    end if;
end;

执行DDL并忽略任何“外键已存在”错误如何


不优雅,但不依赖于键名不变。

尝试
立即执行“alter…”您需要一个带有动态SQL的PL/SQL块,感谢GurV,现在得到另一个错误,即外键已经存在。好像IF有什么问题。当执行SELECT时,它返回一行,但它仍在尝试执行ALTER。。。
declare
    vCheck number;
begin
    select count(1)
    into vCheck
    from user_constraints
    where constraint_name = 'FK_STATIONOBJECTSID'
      and table_name = 'ATTENDANCE';
    --
    if vCheck = 0 then
        execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
    end if;
end;