it-swarm.com.de

Wie kann ich mehrere Zeilen mit einem Sequenzwert in Oracle einfügen?

Ich weiß, dass ich mit einer einzigen Anweisung mehrere Zeilen einfügen kann, wenn ich die Syntax in dieser Antwort verwende. 

Einer der Werte, die ich einfüge, wird jedoch einer Sequenz entnommen, d. H. 

insert into TABLE_NAME
(COL1,COL2)
select MY_SEQ.nextval,'some value' from dual
union all
select MY_SEQ.nextval,'another value' from dual
;

Wenn ich versuche, es auszuführen, erhalte ich einen ORA-02287-Fehler. Gibt es einen Ausweg oder sollte ich einfach viele INSERT-Anweisungen verwenden?

BEARBEITEN:
Wenn ich für alle anderen Spalten außer der Sequenz Spaltennamen angeben muss, verliere ich die ursprüngliche Kürze, also lohnt es sich nicht. In diesem Fall verwende ich einfach mehrere INSERT-Anweisungen.

43
Ovesh

Das funktioniert:

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.

Es funktioniert nicht, weil Sequenz in folgenden Szenarien nicht funktioniert:

  • In einer WHERE-Klausel
  • In einer GROUP BY- oder ORDER BY-Klausel
  • In einer DISTINCT-Klausel
  • Zusammen mit einer UNION oder INTERSECT oder MINUS
  • In einer Unterabfrage 

Quelle: http://www.orafaq.com/wiki/ORA-02287

Das funktioniert jedoch:

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;

Versuch es:

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

Ich denke, das ist es, was Sie wollen, aber ich habe keinen Zugriff auf Oracle, um es jetzt zu testen.

4
EvilTeach

Von Oracle Wiki ist Fehler 02287 

Ein ORA-02287 tritt auf, wenn Sie eine Sequenz verwenden, in der dies nicht zulässig ist.

Von den Stellen, an denen Sequenzen nicht verwendet werden können, scheinen Sie Folgendes zu versuchen:

In einer Unterabfrage

Es scheint also, dass Sie in derselben Anweisung kein Vielfaches machen können.

Die Lösung, die sie anbieten, ist:

Wenn der Sequenzwert in die Spalte eingefügt werden soll Erstellen Sie dann für jede erstellte Zeile einen Auslöser vor dem Einfügen und Holen Sie den Sequenzwert im Trigger und weisen Sie ihn der Spalte zu 

2
billjamesdev

Eine Möglichkeit besteht darin, beim Einfügen einen Auslöser zu erstellen, um die richtige Sequenznummer hinzuzufügen.

1
Brian Schmitt

dies funktioniert und es ist nicht nötig, alle Gewerkschaften zu verwenden.

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