Oracle 在 table 中看不到记录

Oracle doesn't see records in table

我有一个 table,其中包含一些记录。如果相同的记录不在 table 中,我会插入一条新记录。通常它工作正常,但有时它看不到 table 中的记录,并且出现错误“ORA-00001:唯一约束”。

我以为遗漏了一个提交,但它并没有解决我的问题。但我发现,如果我删除 table 中的记录并再次插入它们,它就会开始正常工作。接下来的插入也能正常工作。但是一段时间后,错误再次重复。

我没有对 table 进行任何其他操作。

FOR loading_data IN LoadingDataCursor
LOOP
  SELECT COUNT(1) INTO data_count FROM loaded_data l WHERE
  l.field1 = loading_data.field1 AND
  ...
  l.fieldN = loading_data.fieldN;

  IF data_count = 0 THEN
    INSERT INTO loaded_data ...;
  END IF;
END LOOP;

COMMIT;

另一个事务可能会在您执行 select 和执行 insert 之间提交一行。列的子集也可能存在唯一约束。例如,如果 (field1field2field3) 是唯一的,您可以尝试插入一个与 field1、[=16= 具有相同值的行],并且 field3 作为现有行但具有不同的 field4 值,您的 select 将找不到行,但您的 insert 将出现唯一约束错误。

也许你想做一个 merge 如果键匹配,你 updateloaded_datainsert 行,如果有不是

merge into loaded_data dest
  using( select loading_data.field1, loading_data.field2, ...
           from dual ) src
     on( src.field1 = dest.field1 and
         src.field2 = dest.field2 and 
         src.field3 = dest.field3 )
   when matched then update
     set dest.field4 = src.field4, 
         ...
   when not matched then insert( field1, field2, field3, ... fieldN )
     values( src.field1, src.field2, src.field3, ... src.fieldN );

请注意,您可以使用您在 using 子句中用于 loading_data 游标的查询来仅在单个操作中执行 merge

您可以尝试执行 insert,捕获异常,然后做某事(或什么都不做)

begin
  INSERT INTO loaded_data ...;
exception
  when dup_val_on_index 
  then
    null; -- Ignore the row if it violates a constraint
end;

您可以使用 DML 错误记录来加载所有成功的行并记录所有加载失败的行,以便您可以检查它们

begin
  dbms_errlog.create_error_log( dml_table_name => 'loaded_data' );
end;

insert into loaded_data
  <<query from loading_data cursor>>
  log errors into err$_loaded_data 
    reject limit unlimited