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
之间提交一行。列的子集也可能存在唯一约束。例如,如果 (field1
、field2
、field3
) 是唯一的,您可以尝试插入一个与 field1
、[=16= 具有相同值的行],并且 field3
作为现有行但具有不同的 field4
值,您的 select
将找不到行,但您的 insert
将出现唯一约束错误。
也许你想做一个 merge
如果键匹配,你 update
行 loaded_data
和 insert
行,如果有不是
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
我有一个 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
之间提交一行。列的子集也可能存在唯一约束。例如,如果 (field1
、field2
、field3
) 是唯一的,您可以尝试插入一个与 field1
、[=16= 具有相同值的行],并且 field3
作为现有行但具有不同的 field4
值,您的 select
将找不到行,但您的 insert
将出现唯一约束错误。
也许你想做一个 merge
如果键匹配,你 update
行 loaded_data
和 insert
行,如果有不是
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