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 つが例外を発生させた後に続行したい場合は、次の例が役立つ場合があります。

  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 に答える