2015-05-07 3 views
2

У меня есть несколько строк для вставки в таблицу. В таблице есть некоторые ограничения, которые не выполняются для нескольких строк. Но с инструкцией INSERT ALL, когда она обнаруживает, что первая вставка с ограничением не работает, она перестает вставлять в oracle db, а остальные данные, которые являются правильными, также не вставлены. Будет ли это работать только так. Или у нас есть какой-либо метод, в который вставляются все действительные данные и игнорируются другие вставки в INSERT ALL.Инструкция INSERT ALL в Oracle, не вставляемая

+1

вы можете отправить запрос? –

+0

Как уже упоминалось выше, пожалуйста, напишите инструкцию DDL для всех таблиц, в которые вы пытаетесь включить INSERT, а также инструкцию INSERT. –

ответ

2

, когда он обнаруживает, что первая вставка с ограничением не работает, прекращает вставку в 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 
+0

Спасибо, я в настоящее время вставляю в качестве отдельных инструкций вставки через скрипт. Но хотелось попробовать INSERT ALL, но был неудачным из-за того, что некоторые строки имели нарушения. –

+0

Вы можете получить обработку исключений в PL/SQL, однако в SQL оператор INSERT ALL является одной транзакцией. Либо все строки вставлены, либо нет. Это основное правило атомарности. –

Смежные вопросы