Оператор INSERT ALL в Oracle не може да се вмъкне

Имам няколко реда за вмъкване в таблица. Има някои ограничения в таблицата, които се провалят за няколко от редовете. Но с инструкцията INSERT ALL, когато открие, че първото вмъкване с ограничение е неуспешно, спира вмъкването в Oracle db и останалите данни, които са правилни, също не се вмъкват. Дали ще работи само по този начин. Или имаме някакъв метод, в който вмъкваме всички валидни данни и игнорираме другите вмъквания в INSERT ALL.


person Veena Sujith    schedule 07.05.2015    source източник
comment
можете ли да публикувате запитването?   -  person Mudassir Hasan    schedule 07.05.2015
comment
Както вече спомена @mmhasannn - моля, публикувайте израза DDL за всички таблици, в които се опитвате да INSERT, както и вашия оператор INSERT.   -  person Frank Schmitt    schedule 07.05.2015


Отговори (1)


когато установи, че първото вмъкване с ограничение е неуспешно, спира вмъкването в Oracle db и останалите данни, които са правилни, също не се вмъкват. Дали ще работи само по този начин.

Да, проектиран е да работи по този начин. Операторът INSERT ALL няма да успее да вмъкне ако някой от редовете има грешка.

Например,

SQL> CREATE TABLE t(a NUMBER);

Table created.

SQL> ALTER TABLE t ADD CONSTRAINT t_unique UNIQUE(a);

Table altered.

SQL> INSERT INTO t(a) VALUES(1);

1 row created.

SQL> INSERT ALL
  2    INTO t (a) VALUES (1)
  3    INTO t (a) VALUES (2)
  4    INTO t (a) VALUES (3)
  5  SELECT * FROM dual;
INSERT ALL
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.T_UNIQUE) violated    

SQL> SELECT * FROM t;

         A
----------
         1

Ако искате да бъдат вмъкнати други стойности, които са правилни, тогава ги поставете като отделни изрази за вмъкване и изпълнете всички изрази за вмъкване като скрипт.

Например,

SQL> CREATE TABLE t(a NUMBER);

Table created.

SQL> ALTER TABLE t ADD CONSTRAINT t_unique UNIQUE(a);

Table altered.

SQL> INSERT INTO t(A) VALUES(1);

1 row created.

SQL> INSERT INTO t(a) VALUES(1);
INSERT INTO t(a) VALUES(1)
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.T_UNIQUE) violated    

SQL> INSERT INTO t(A) VALUES(2);

1 row created.

SQL> INSERT INTO t(A) VALUES(3);

1 row created.

SQL> SELECT * FROM t;

         A
----------
         1
         2
         3
person Lalit Kumar B    schedule 07.05.2015
comment
Благодаря ви, в момента вмъквам като отделни изрази за вмъкване чрез скрипт. Но исках да опитам INSERT ALL, но не успях, защото някои редове имат нарушения. - person Veena Sujith; 07.05.2015
comment
Можете да постигнете обработка на изключения в PL/SQL, но в SQL операторът INSERT ALL е една единствена транзакция. Или всички редове са вмъкнати, или нито един. Това е основното правило за атомарност. - person Lalit Kumar B; 07.05.2015