web-dev-qa-db-fra.com

Comment puis-je insérer plusieurs lignes dans Oracle avec une valeur de séquence?

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.

43
Ovesh

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)
41
WW.

Cela ne fonctionne pas car la séquence ne fonctionne pas dans les scénarios suivants:

  • Dans une clause WHERE
  • Dans une clause GROUP BY ou ORDER BY
  • Dans une clause DISTINCT
  • Avec un UNION ou INTERSECT ou MOINS
  • Dans une sous-requête 

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;
24
Dilshod Tadjibaev
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.

4
EvilTeach

Une possibilité consiste à créer un déclencheur à l'insertion pour ajouter le numéro de séquence correct.

1
Brian Schmitt

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