sql >> データベース >  >> RDS >> Oracle

Oracleの「INSERTALL」は重複を無視します

    Oracleでは、ステートメントは完全に成功するか、完全に失敗します(アトミックです)。ただし、場合によっては、エラーを発生させる代わりに、例外をログに記録する句を追加できます。

    2番目の方法はすべて自動です。これがデモです(11gR2を使用):

    SQL> CREATE TABLE test (pk1 NUMBER,
      2                     pk2 NUMBER,
      3                     CONSTRAINT pk_test PRIMARY KEY (pk1, pk2));
    
    Table created.
    
    SQL> /* Statement fails because of duplicate */
    SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2);
    
    ERROR at line 1:
    ORA-00001: unique constraint (VNZ.PK_TEST) violated
    
    SQL> BEGIN dbms_errlog.create_error_log('TEST'); END;
      2  /
    
    PL/SQL procedure successfully completed.
    
    SQL> /* Statement succeeds and the error will be logged */
    SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2)
      2   LOG ERRORS REJECT LIMIT UNLIMITED;
    
    1 row(s) inserted.
    
    SQL> select ORA_ERR_MESG$, pk1, pk2 from err$_test;
    
    ORA_ERR_MESG$                                       PK1 PK2
    --------------------------------------------------- --- ---
    ORA-00001: unique constraint (VNZ.PK_TEST) violated   1   1
    

    LOG ERRORを使用できます INSERT ALLを含む句 ( @AlexPoole に感​​謝します )、ただし、各テーブルの後に句を追加する必要があります:

    SQL> INSERT ALL
      2   INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED
      3   INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED
      4  (SELECT * FROM dual);
    
    0 row(s) inserted.
    


    1. EXPLAINプランに基づいてMySQLクエリを最適化する方法

    2. 一般的な単語で始まるpsql(PostgreSQLインタラクティブターミナル)のすべてのテーブルを削除するにはどうすればよいですか?

    3. 単純な更新クエリでのpostgresのデッドロック

    4. SQLドット表記