Ответ 1
Это работает:
insert into TABLE_NAME (COL1,COL2)
select my_seq.nextval, a
from
(SELECT 'SOME VALUE' as a FROM DUAL
UNION ALL
SELECT 'ANOTHER VALUE' FROM DUAL)
Я знаю, что я могу вставить несколько строк, используя один оператор, если я использую синтаксис в этом ответе.
Однако одно из значений, которые я вставляю, берется из последовательности, то есть
insert into TABLE_NAME
(COL1,COL2)
select MY_SEQ.nextval,'some value' from dual
union all
select MY_SEQ.nextval,'another value' from dual
;
Если я попытаюсь запустить его, я получаю ошибку ORA-02287. Есть ли способ обойти это, или я должен просто использовать множество инструкций INSERT?
EDIT:
Если мне нужно указывать имена столбцов для всех других столбцов, отличных от последовательности, я теряю первоначальную краткость, поэтому это просто не стоит. В этом случае я просто использую несколько инструкций INSERT.
Это работает:
insert into TABLE_NAME (COL1,COL2)
select my_seq.nextval, a
from
(SELECT 'SOME VALUE' as a FROM DUAL
UNION ALL
SELECT 'ANOTHER VALUE' FROM DUAL)
Это не работает, потому что последовательность не работает в следующих сценариях:
Источник: http://www.orafaq.com/wiki/ORA-02287
Однако это работает:
insert into table_name
(col1, col2)
select my_seq.nextval, inner_view.*
from (select 'some value' someval
from dual
union all
select 'another value' someval
from dual) inner_view;
Попробуйте:
create table table_name(col1 varchar2(100), col2 varchar2(100));
create sequence vcert.my_seq
start with 1
increment by 1
minvalue 0;
select * from table_name;
insert into TABLE_NAME
(COL1,COL2)
WITH
data AS
(
select 'some value' x from dual
union all
select 'another value' x from dual
)
SELECT my_seq.NEXTVAL, x
FROM data
;
Я думаю, что это то, что вы хотите, но у меня нет доступа к oracle, чтобы проверить его прямо сейчас.
Из Oracle Wiki, ошибка 02287
ORA-02287 возникает, когда вы используете последовательность, где это не разрешено.
Из мест, где не могут использоваться последовательности , вы, кажется, пытаетесь:
В подзапросе
Итак, кажется, что вы не можете делать кратность в одном выражении.
Предлагаемое решение:
Если вы хотите, чтобы значение последовательности было вставлено в столбец для каждой созданной строки, затем создайте триггер перед вставкой и выберите значение последовательности в триггере и назначьте его столбцу
Возможность создания триггера для вставки для добавления в правильный порядковый номер.
это работает, и нет необходимости использовать все соединения.
Insert into BARCODECHANGEHISTORY (IDENTIFIER,MESSAGETYPE,FORMERBARCODE,NEWBARCODE,REPLACEMENTDATETIME,OPERATORID,REASON)
select SEQ_BARCODECHANGEHISTORY.nextval, MESSAGETYPE, FORMERBARCODE, NEWBARCODE, REPLACEMENTDATETIME, OPERATORID, REASON
from (
SELECT
'BAR' MESSAGETYPE,
'1234567890' FORMERBARCODE,
'1234567899' NEWBARCODE,
to_timestamp('20/07/12','DD/MM/RR HH24:MI:SSXFF') REPLACEMENTDATETIME,
'PIMATD' OPERATORID,
'CORRECTION' REASON
FROM dual
);