Je sais que je peux insérer plusieurs lignes en utilisant une seule instruction, si j'utilise la syntaxe dans this answer .
Cependant, l’une des valeurs que j’insère est tirée d’une séquence, c’est-à-dire
insert into TABLE_NAME
(COL1,COL2)
select MY_SEQ.nextval,'some value' from dual
union all
select MY_SEQ.nextval,'another value' from dual
;
Si j'essaie de l'exécuter, j'obtiens une erreur ORA-02287. Existe-t-il un moyen de contourner ce problème ou devrais-je simplement utiliser beaucoup d'instructions INSERT?
MODIFIER:
Si je dois spécifier des noms de colonne pour toutes les autres colonnes que la séquence, je perds la brièveté initiale, ce qui ne vaut donc pas la peine. Dans ce cas, je vais simplement utiliser plusieurs instructions INSERT.
Cela marche:
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)
Cela ne fonctionne pas car la séquence ne fonctionne pas dans les scénarios suivants:
Source: http://www.orafaq.com/wiki/ORA-02287
Cependant cela fonctionne:
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;
Essaye le:
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
;
Je pense que c'est ce que vous voulez, mais je n'ai pas accès à Oracle pour le tester pour le moment.
Une possibilité consiste à créer un déclencheur à l'insertion pour ajouter le numéro de séquence correct.
cela fonctionne et il n'y a pas besoin d'utiliser l'union.
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
);