Подтвердить что ты не робот

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

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

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

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.

4b9b3361

Ответ 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)

Ответ 2

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

  • В предложении WHERE
  • В предложении GROUP BY или ORDER BY
  • В предложении DISTINCT
  • Наряду с UNION или INTERSECT или MINUS
  • В подзапросе

Источник: 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;

Ответ 3

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, чтобы проверить его прямо сейчас.

Ответ 4

Из Oracle Wiki, ошибка 02287

ORA-02287 возникает, когда вы используете последовательность, где это не разрешено.

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

В подзапросе

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

Предлагаемое решение:

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

Ответ 5

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

Ответ 6

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

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