我有一些使用
的sql脚本INSERT INTO secondtable
(field, field1)
SELECT field, field2
FROM table;
我使用oracle 9.x和sqldevelopper。
当我启动它们时,在某些插入上选择我得到外键错误。所以他们没有插入那些工作的人。
当出现错误并且可能显示或记录错误时,是否可以说oracle继续相同?
答案 0 :(得分:5)
您无法在ORacle 9中继续基于集合的插入失败。您必须使语句失效,或者接受它将被回滚。
选项:
如果此类错误很少见,请尝试基于集合的工作并添加一个异常处理程序,在发生错误时执行基于行的解决方案,并在出现错误时显示错误(或将其存储在某处以便进一步处理)发生。是的,这会重复工作,但大部分时间都会进行最有效的操作,当错误发生时,它会在您决定时处理它们。
如果这是常见现象,请将其吸收并切换到如上所述的基于行的解决方案。尽可能优化并希望有一天你可以利用#3)
升级到Oracle 10并利用DML error logging
答案 1 :(得分:3)
不在Oracle 9i中,没有。在10.2中,引入了DML error logging,这正是您想要的。
在早期版本中,最常见的方法是执行PL / SQL,即
BEGIN
FOR src IN (SELECT field1, field2
FROM source_table)
LOOP
BEGIN
INSERT INTO destination_table( field1, field2 )
VALUES( src.field1, src.field2 );
EXCEPTION
WHEN dup_val_on_index
THEN
<<log the foreign key error>>
END;
END LOOP;
END;
您还可以使用SQL来分隔违反外键的行,即
INSERT INTO error_table( field1, field2 )
SELECT field1, field2
FROM source_table
WHERE NOT EXISTS(
SELECT 1
FROM parent_table
WHERE parent_table.field1 = source_table.field1 );
INSERT INTO destination_table( field1, field2 )
SELECT field1, field2
FROM source_table
WHERE EXISTS(
SELECT 1
FROM parent_table
WHERE parent_table.field1 = source_table.field1 );