我怎么能插入多个行与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语句。

这工作:

 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子句中
  • 在DISTINCT子句中
  • 随着联盟或INTERSECT或减less
  • 在一个子查询中

资料来源: 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来testing它。

从Oracle Wiki ,错误02287是

在不允许的情况下使用序列时,会发生ORA-02287。

序列不能使用的地方,你似乎在尝试:

在一个子查询中

所以看来你不能在同一个陈述中做多个。

他们提供的解决scheme是:

如果希望将序列值插入到创build的每一行的列中,则创build一个插入前触发器并获取触发器中的序列值并将其分配给列

一种可能性是在插入时创build一个触发器来添加正确的序列号。

这工作,并没有必要使用工会。

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