插入选择继续错误

时间:2011-02-09 19:12:00

标签: sql oracle error-handling insert oracle9i

我有一些使用

的sql脚本
INSERT INTO secondtable 
  (field, field1)
SELECT field, field2 
  FROM table;

我使用oracle 9.x和sqldevelopper。

当我启动它们时,在某些插入上选择我得到外键错误。所以他们没有插入那些工作的人。

当出现错误并且可能显示或记录错误时,是否可以说oracle继续相同?

2 个答案:

答案 0 :(得分:5)

您无法在ORacle 9中继续基于集合的插入失败。您必须使语句失效,或者接受它将被回滚。

选项:

  1. 如果此类错误很少见,请尝试基于集合的工作并添加一个异常处理程序,在发生错误时执行基于行的解决方案,并在出现错误时显示错误(或将其存储在某处以便进一步处理)发生。是的,这会重复工作,但大部分时间都会进行最有效的操作,当错误发生时,它会在您决定时处理它们。

  2. 如果这是常见现象,请将其吸收并切换到如上所述的基于行的解决方案。尽可能优化并希望有一天你可以利用#3)

  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 );