Как вставить несколько строк в oracle со значением последовательности?

Я знаю, что могу вставить несколько строк, используя один оператор, если я использую синтаксис в ответ.

однако одно из значений, которое я вставляю, берется из последовательности, т. е.

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?

изменить:
Если мне нужно указать имена столбцов для всех других столбцов, кроме последовательности, я теряю оригинальная краткость, так что просто не стоит. В этом случае я просто использую несколько инструкций INSERT.

6 ответов


это работает:

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)

это не работает, потому что последовательность не работает в следующих случаях:

  • в предложении WHERE
  • в предложении GROUP BY или ORDER BY
  • в п.
  • вместе с объединением или пересечением или минус
  • в подзапросе

источник: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 возникает при использовании последовательности, где это не разрешено.

из мест, где последовательностями не могу используйте, вы, кажется, пытаетесь:

в подзапросе

таким образом, кажется, вы не можете делать кратные в одном и том же заявлении.

решение, которое они предлагают, является:

Если вы хотите, чтобы значение последовательности для вставки в колонку для каждой созданной строки создайте триггер before insert и извлеките значение последовательности в триггере и назначьте его столбцу


возможность состоит в том, чтобы создать триггер на insert, чтобы добавить правильный порядковый номер.


это работает, и нет необходимости использовать union all.

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
);