【问题标题】:Insert select continue with error插入选择继续出错
【发布时间】:2013-10-16 19:08:47
【问题描述】:

我有一些使用的 sql 脚本

INSERT INTO secondtable 
  (field, field1)
SELECT field, field2 
  FROM table;

我使用 oracle 9.x 和 sqldevelopper。

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

是否可以在出现错误时告诉 oracle 继续执行相同的操作,并在可能的情况下显示或记录错误?

【问题讨论】:

  • 我会调整脚本来处理这种情况,而不是抑制错误。您可以禁用约束,但在启用约束之前您仍然必须处理不良数据。

标签: sql oracle error-handling insert oracle9i


【解决方案1】:

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

选项:

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

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

  3. 升级到 Oracle 10 并利用 DML error logging

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      相关资源
      最近更新 更多