我怎么能插入多个行与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 );