44 votes

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

Je sais qu'il est possible d'insérer plusieurs lignes à l'aide d'une seule instruction, si j'utilise la syntaxe de l'instruction suivante cette réponse .

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. Y a-t-il un moyen de contourner ce problème, ou dois-je simplement utiliser de nombreuses instructions INSERT ?

EDIT :
Si je dois spécifier des noms de colonnes pour toutes les autres colonnes autres que la séquence, je perds la brièveté originale, donc cela n'en vaut pas la peine. Dans ce cas, je me contenterai d'utiliser plusieurs instructions INSERT.

41voto

WW. Points 11335

Ça 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)

24voto

Dilshod Tadjibaev Points 951

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
  • ainsi qu'une UNION, une INTERSECTION ou un MOINS.
  • Dans une sous-requête

Fuente: 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;

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

4voto

EvilTeach Points 12235
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 en ce moment.

2voto

Bill James Points 7554

De Oracle Wiki l'erreur 02287 est

Une ORA-02287 se produit lorsque vous utilisez une séquence alors qu'elle n'est pas autorisée.

Des endroits où les séquences ne peut pas être utilisé, vous semblez essayer :

Dans une sous-requête

Il semble donc que vous ne puissiez pas en faire plusieurs dans la même déclaration.

La solution qu'ils proposent est la suivante :

Si vous voulez que la valeur de la séquence soit insérée dans la colonne pour chaque ligne créée, alors créez un déclencheur before insert et récupérez la valeur de la séquence dans le déclencheur et affectez-la à la colonne.

1voto

Brian Schmitt Points 4246

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X