2012-09-18 70 views
2

我想知道在Oracle中将多个记录复制到忽略特定索引重复值的数据库中的首选技术是什么。该语句在声明中明确指出,不从另一个表来Oracle SQL多重插入忽略重复行

INSERT INTO EXAMPLE (A, B, C, D) VALUES (null,'example1','example2',EXAMPLE_SEQ.nextval); 
INSERT INTO EXAMPLE (A, B, C, D) VALUES (null,'example2','example3',EXAMPLE_SEQ.nextval); 
INSERT INTO EXAMPLE (A, B, C, D) VALUES (null,'example4','example5',EXAMPLE_SEQ.nextval); 

我目前做这样的手动检查,但需要找到一种方法,使这些可以作为脚本

处理
+0

你可以执行它们作为脚本(SQL Developer中的F5,Toad,Sql Navigator等中有一个simillar按钮)。它只是记录一个错误并继续。 –

回答

3

如果你已经决定与INSERTs坚持就可以防止重复行的插入使用限制无论主键或唯一键。如果碰巧违反了一个唯一的约束条件,你的脚本将会停止,你将不得不漫游所有先前插入的变化(除非你已经犯下了每一个变化)。为了处理这个异常,你可以写一个类似的pls/sql块。

declare 
    l_unique_exception exception; 
    pragma exception_init(l_unique_exception, -1); 
begin 
    insert into test(id, test_vector) 
    values(1, 123); 
    insert into test(id, test_vector) 
    values(1, 123); 
    ...... 
    Insert into 
    commit; 
exception 
    when l_unique_exception 
    then process the exception;  
end; 

此外

如果你想继续,刀片的一个抛出一个异常,则下面的例子可能会派上用场了。

  1. 创建一个将包含错误的表。例如。

    CREATE TABLE tb_errors ( ErrorTag varchar2(123) )

  2. 提供一个错误记录调用过程的DBMS_ERRLOGCREATE_ERROR_LOG

    DBMS_ERRLOG.CREATE_ERROR_LOG('YourDmlTable. Test in this case', 'tb_errors');

  3. 添加log errors into子句每个insert

下面是一个例子

declare 
begin 
    insert into test(id, col1) 
    values(1, 123) 
    log errors into tb_errors('simple expression') reject limit unlimited; 
    insert into test(id, col1) 
    values(1, 123) 
    log errors into tb_errors('simple expression') reject limit unlimited; 
    insert into test(id, col1) 
    values(1, 123) 
    log errors into tb_errors('simple expression') reject limit unlimited; 
    commit; 
end; 

后您的脚本完成后,您可以查询错误记录表,tb_errors在这种情况下,看看有什么地方出了错。

+0

我正在用这种技术,我不明白你是如何捕获一个唯一的密钥违规,但它似乎不是一个错误,你可以根据Oracle文档11g – user898465

+0

捕获好,我知道你在做什么,在这里指定一个自定义错误抛出ORA - 00001时抛出。然而这对我不起作用。我只是通过抛出null来处理它,但脚本仍然失败并回滚。 – user898465

+0

我做了一些修改 –

2

您应该查看MERGE语法。

http://en.wikipedia.org/wiki/Merge_(SQL

merge example target 
using (select 1 as id, 'a' as val) as source 
    on source.id = target.id 
    and source.val = target.val 
when not matched then 
    insert (id, val) values (source.id, source.val); 
+0

我见过的所有合并示例都将一个表合并到另一个表中。我没有看到插入脚本中明确声明值的示例。 – user898465

+0

@ user898465查看示例 – podiluska

+0

我是否认为每个插入都必须使用单独的合并块?看起来像一个非常基本的插入非常多的代码。 – user898465