首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入select continue with错误

插入select continue with错误
EN

Stack Overflow用户
提问于 2011-02-10 03:12:00
回答 2查看 2.3K关注 0票数 1

我有一些sql脚本,它们使用

代码语言:javascript
复制
INSERT INTO secondtable 
  (field, field1)
SELECT field, field2 
  FROM table;

我使用oracle9.x和sqldevelopper。

当我启动它们时,在某些insert select时,我得到了外键错误。所以他们没有插入工作的集合。

当错误出现时,是否可以告诉oracle继续相同的操作,如果可能,还可以显示或记录错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-10 03:28:37

您不能在ORacle 9中继续执行失败的基于set的insert。您要么必须使语句failsafe,要么接受它将被回滚。

选项:

  1. 如果此类错误很少见,请尝试基于集合的工作,并添加一个异常处理程序,该处理程序在发生错误时执行基于行的解决方案,并在发生错误时显示错误(或将其存储在某个位置以供进一步处理)。是的,这会重复工作,但大多数情况下会进行最有效的操作,当错误发生时,它会根据您的决定处理它们。
  2. 如果这是常见的情况,接受它并切换到上面的基于行的解决方案。尽您所能进行优化,并希望有一天您可以利用#3)
  3. 升级到Oracle10和利用DML error logging
票数 5
EN

Stack Overflow用户

发布于 2011-02-10 03:24:12

不是在Oracle9i中。在10.2中,引入了DML error logging,这似乎正是您想要的。

在早期版本中,最常见的方法是使用PL/SQL,即

代码语言:javascript
复制
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来分隔违反外键的行,例如

代码语言:javascript
复制
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 );
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4949357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档