2

我想知道 Oracle 中将多条记录复制到忽略某个索引上的重复值的数据库中的首选技术是什么。语句在语句中明确说明并且不来自另一个表

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

我目前正在这样做并手动检查,但需要找到一种方法以便将这些作为脚本处理

4

3 回答 3

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_ERRLOG包的CREATE_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在这种情况下,查看发生了什么问题。

于 2012-09-18T09:01:01.480 回答
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);
于 2012-09-18T08:56:04.133 回答
0

如果您的目标是对不正确的数据提供额外的处理,我建议您使用 LOG 错误子句。请考虑http://www.oracle-base.com/articles/10g/dml-error-logging-10gr2.php - 有很好的例子。

于 2012-09-18T09:59:26.387 回答