Как я могу вставить несколько строк в Oracle с помощью значения последовательности? - PullRequest
43 голосов
/ 23 октября 2008

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

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

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.

Ответы [ 6 ]

41 голосов
/ 23 октября 2008

Это работает:

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)
24 голосов
/ 26 октября 2008

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

  • В предложении WHERE
  • В предложении GROUP BY или ORDER BY
  • В предложении DISTINCT
  • Вместе с СОЮЗОМ или ИНТЕРСЕКТОМ или МИНУСОМ
  • В подзапросе

Источник: 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;
4 голосов
/ 23 октября 2008
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
;

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

2 голосов
/ 23 октября 2008

С Oracle Wiki , ошибка 02287 -

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

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

В подзапросе

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

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

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

1 голос
/ 23 октября 2008

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

0 голосов
/ 20 июля 2012

это работает, и нет необходимости использовать 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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...