Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle 'INSERT ALL' игнорира дубликатите

В Oracle изразите или успяват напълно, или се провалят напълно (те са атомарни). Можете обаче да добавите клаузи в определени случаи, за да регистрирате изключения, вместо да генерирате грешки:

  • използване на ГРУПОВО СЪБИРАНЕ - ЗАПАЗЕТЕ ИЗКЛЮЧЕНИЯ , както е показано в тази тема на askTom ,
  • или чрез DBMS_ERRLOG (предлага се от 10 g мисля).

Вторият метод е изцяло автоматичен, ето демонстрация (с помощта на 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 (благодаря @Alex Poole ), но трябва да добавите клаузата след всяка таблица:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на CONTINUE In Loops за възобновяване на контрола в Oracle

  2. Как анализирате прост XML фрагмент в Oracle PL/SQL и го зареждате в глобална временна таблица?

  3. Грешка при персонализирана заявка за пагиниране при извличане на първите N реда

  4. Групирайте редове въз основа на сумата на колоната

  5. Колекция на Oracle в клауза where