INSERT (SQL)

Common Set-Syntax:

INSERT INTO table-name

(*) [VALUES-clause]
[(column-list)] VALUE-LIST

Extended Set-Syntax:

INSERT INTO table-name

(*) [OVERRIDING USER VALUE]   [VALUES-clause]
[(column-list)] [include-columns] [OVERRIDING USER VALUE] VALUE-LIST

This Dokumentcovers the following topics:

Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.

Gehört zur Funktionsgruppe: Datenbankzugriffe und Datenbankänderungen

Siehe auch INSERT - SQL im Teil Natural for DB2 in der Database Management System Interfaces-Dokumentation:


Funktion

Das SQL-INSERT-Statement dient dazu, einer Tabelle eine oder mehrere neue Zeilen hinzuzufügen.

Syntax-Beschreibung

Syntax-Element Beschreibung
INTO table-name
INTO-Klausel:

In der INTO-Klausel geben Sie an, in welcher Tabelle neue Zeilen hinzugefügt werden sollen.

Siehe weitere Informationen zu table-name.

column-list
Spaltenliste:

Syntax:

column-name... 

Als column-list können Sie column-names für eine oder mehrere Spalten angeben, die in der hinzugefügten Zeile Werte erhalten sollen.

Bei Angabe einer column-list muss die Reihenfolge der angegebenen Spalten der Reihenfolge der Werte entsprechen, die entweder in der insert-item-list angegeben sind oder im angegebenen View enthalten sind (siehe unten).

Wenn Sie bei column-list keine Spaltenliste angeben, werden die in der insert-item-list bzw. im View angegebenen Werte entsprechend einer impliziten Liste aller Spalten eingefügt, und zwar in der Reihenfolge, in der sie in der Tabelle stehen.

include-columns
Include Columns-Klausel:

include-columns gibt zusätzlich zu den table-name-Spalten einen Satz Spalten in der Ergebnistabelle des INSERT-Statement an, wenn dieses in der FROM-Klausel eines SELECT-Statement verschachtelt ist.

Weitere Informationen siehe include-columns.

VALUES-clause
VALUES-Klausel:

Mit der VALUES-Klausel fügen Sie eine einzelne Zeile in die Tabelle ein.

Siehe VALUES-Klausel weiter unten.

OVERRIDING USER VALUE
OVERRIDING USER VALUE-Klausel:

Diese Klausel gehört zm SQL Extended Set.

Diese Klausel bewirkt, dass der Wert ignoriert wird, der in der VALUES-Klausel angegeben ist oder von einem Fullselect für eine Spalte erzeugt wurde, die als GENERATED ALWAYS definiert worden ist.

VALUES-Klausel

Mit der VALUES-Klausel fügen Sie eine einzelne Zeile in die Tabelle ein. Der VALUES-Klausel kann entweder ein Stern (*) oder eine Spaltenliste (column-list) vorangestellt werden, und sie hat dementsprechend eine der folgenden Formen:

VALUES-Klausel mit vorangehender Stern-Notation

VALUES (VIEW view-name)

Wenn Sie Stern-Notation benutzen, müssen Sie in der VALUES-Klausel einen View angeben. Mit den Feldwerten des Views wird dann eine neue Zeile in die Tabelle eingefügt, wobei die Feldnamen des Views als Spaltennamen der Zeile verwendet werden.

VALUES-Klausel mit vorangehender Spaltenliste

[(column-list)] [OVERRIDING USER VALUE] VALUE-LIST

Wenn Sie bei column-list eine Spaltenliste angeben und in der VALUES-Klausel einen View referenzieren, muss die Anzahl der Spalten in der Spaltenliste der Anzahl der Felder im View innerhalb der VALUE-LIST entsprechen.

Wenn Sie keine Spaltenliste angeben, werden die im View angegebenen Werte entsprechend der impliziten Liste aller Spalten in der Reihenfolge, in der sie in der Tabelle stehen, eingefügt.

VALUE-LIST

Common Set-Syntax:

VALUES

(VIEW view-name)
(insert-item-list)

[FOR-n-ROWS-clause]

Extended Set-Syntax:

VALUES

(VIEW view-name)
(insert-item-list)

[FOR-n-ROWS-clause]

[WITH_CTE common-table-expression,...] select-expression

WITH

RR
RS
CS

[QUERYNO integer]

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
VIEW view-name
View-Name:

Mit den Feldwerten dieses Views wird eine neue Zeile in die angegebene Tabelle eingefügt, wobei die Feldnamen des Views als Spaltennamen der Zeile benutzt werden.

insert-item-list
INSERT Single Row-Klausel:

In der insert-item-list können Sie einen oder mehrere Werte angeben, die den in der column-list angegebenen Spalten zugeordnet werden sollen. Die Reihenfolge der angegebenen Werte muss mit der Reihenfolge der Spalten übereinstimmen.

Wenn keine column-list angegeben wird, werden die Werte in der insert-item-list nach einer impliziten Liste mit allen Spalten in der Reihenfolge eingefügt, wie sie in der Tabelle vorkommen.

Die in der insert-item-list anzugebenden Werte können Konstanten, Parameter, spezielle Register oder NULL sein.

Informationen zu view-name, constant und parameter siehe Grundlegende Syntaxbestandteile . Siehe auch die Informationen zu special-register.

Wenn der Wert NULL zugewiesen worden ist, bedeutet dies, dass das adressierte Feld keinen Wert erhalten soll (auch nicht den Wert 0 oder Leerzeichen).

Beispiel für INSERT Single Row:

...
INSERT INTO SQL-PERSONNEL (NAME,AGE)
  VALUES ('ADKINSON',35)
...
FOR-n-ROWS-clause
FOR n Rows-Klausel:

Optionale Klausel, siehe FOR-n-ROWS-Klausel weiter unten.

WITH_CTE common-table-expression
WITH_CTE-Klausel:

Diese Klausel gehört zum SQL Extended Set.

Diese optionale Klausel ermöglicht die Definition einer Ergebnistabelle, die in einer FROM-Klausel des folgenden SELECT-Statements referenziert werden kann. Mehrere common-table-expressions können nach dem einzelnen Schlüsselwort WITH_CTE angegeben werden. Jeder common-table-expressions kann auch in der FROM-Klausel der nachfolgenden common-table-expressions referenziert werden.

Weitere Informationen siehe WITH_CTE common-table-expression beim SELECT-Statement.

select-expression
INSERT Multiple Rows-Klausel:

Diese Klausel gehört zum SQL Extended Set.

Mit einem select-expression können Sie mehrere Zeilen in eine Tabelle einfügen. Der select-expression wird ausgewertet und jede Zeile der Ergebnistabelle wird so behandelt, als ob die Werte in der Zeile als Werte in einer VALUES-Klausel einer Single-Row-Insert-Operation angegeben werden.

Weitere Informationen siehe Select-Ausdrücke.

Beispiel für Insert Multiple Rows:

...
INSERT INTO SQL-RETIREE (NAME,AGE,SEX)
  SELECT LASTNAME, AGE, SEX
  FROM SQL-EMPLOYEES
  WHERE AGE > 60
...

Anmerkung:
Die Anzahl der tatsächlich eingefügten Zeilen können Sie mit der Systemvariablen *ROWCOUNT überprüfen (siehe Systemvariablen-Dokumentation).

WITH RR/RS/CS
WITH Isolation Level-Klausel:

Diese Klausel gehört zum SQL Extended Set.

Diese Klausel ermöglicht die explizite Angabe des zum Auffinden der einzufügenden Zeilen benutzten Isolationsstufe.

CS Cursor Stability
RR Repeatable Read
RS Read Stability
QUERYNO_integer
QUERYNO-Klausel:

Diese Klausel gehört zum SQL Extended Set.

Diese Klausel gibt explizit die bei der EXPLAIN-Ausgabe und zur Ablaufverfolgung der Sätze für dieses Statement zu benutzende Anzahl an.

FOR-n-ROWS-Klausel

FOR

[:]_host-variable
integer

ROWS [atomic-clause]

Diese Klausel setzt sich aus den folgenden Subklauseln zusammen:

FOR [:] hostvariable/integer ROWS-Klausel

FOR

[:]_host-variable
integer

ROWS

Die Angabe dieser Klausel ist optional. Sie sollte nur angegeben werden, wenn

Wenn sie angegeben wird, legt die Option [:] hostvariable/integer die Anzahl der Zeilen fest, die in die DB2-Tabelle eingefügt werden sollen, und zwar von den Arrays, die in der insert-item-list der VALUES-Klausel ab der ersten Ausprägung angegeben wurden.

Diese Klausel soll die Verarbeitungszeit der Programme verbessern, mittels derer Zeilen aus Natural-Arrays in einer Schleife eingefügt werden. Anhand dieser Klausel können die in den Arrays enthaltenen Zeilen von einem SQL-Statement eingefügt werden.

Siehe Beispiel weiter unten.

Siehe auch den Teil Natural for DB2 in der Database Management System Interfaces-Dokumentation.

ATOMIC-Klausel

ATOMIC
NOT ATOMIC CONTINUE ON SQLEXCEPTION

Diese Klausel gibt an, ob die Einfügung mehrerer Zeilen von DB2 als ATOMIC-Operation behandelt werden soll oder nicht.

Sie sollte nur angegeben werden, wenn

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
ATOMIC Gibt an, dass im Falle eines Fehlers keine Zeile in die Zieltabelle eingefügt wird.

Dies ist der Standardwert.

NOT ATOMIC CONTINUE ON SQLEXCEPTION Gibt an, dass im Falle von Fehlern alle Zeilen eingefügt werden, bei denen keine Fehler aufgetreten sind, während diejenigen Zeilen, bei denen Fehler aufgetreten sind, von DB2 beseitigt werden.

Die in solchen Fällen zurückgegebenen sqlcodes entnehmen sie der DB2 SQL REFERENCE.

Beispiel

DEFINE DATA LOCAL                                                         
01 NAME        (A20/1:10)  INIT <'ZILLER1','ZILLER2','ZILLER3','ZILLER4'
                                ,'ZILLER5','ZILLER6','ZILLER7','ZILLER8'
                                ,'ZILLER9','ZILLERA'>                  
01 ADDRESS     (A100/1:10) INIT <'ANGEL STREET 1','ANGEL STREET 2'        
                                ,'ANGEL STREET 3','ANGEL STREET 4'        
                                ,'ANGEL STREET 5','ANGEL STREET 6'        
                                ,'ANGEL STREET 7','ANGEL STREET 8'      
                                ,'ANGEL STREET 9','ANGEL STREET 10'>      
01 DATENATD (D/1:10)  INIT <D'1954-03-27',D'1954-03-27',D'1954-03-27'   
                            ,D'1954-03-27',D'1954-03-27',D'1954-03-27'    
                            ,D'1954-03-27',D'1954-03-27',D'1954-03-27'  
                            ,D'1954-03-27'>                               
01 SALARY      (P4.2/1:10) INIT <1000,2000,3000,4000,5000               
                                ,6000,7000,8000,9000,9999>                
01 L§ADDRESS   (I2/1:10) INIT <14,14,14,14,14,14,14,14,14,15>         
01 N§ADDRESS   (I2/1:10) INIT <00,00,00,00,00,00,00,00,00,00>             
01 ROWS        (I4)                                               
01 INDEX       (I4)                                                       
01 V1 VIEW OF NAT-DEMO_ID  
02 NAME                                                            
02 ADDRESS     (EM=X(20))                                          
02 DATEOFBIRTH                                                     
02 SALARY                                                          
01 ROWCOUNT  (I4)                                                  
END-DEFINE                                                         
OPTIONS DB2ARRY=ON                  /* <-- ENABLE DB2 ARRAY     
ROWCOUNT := 10                                                     
INSERT INTO NAT-DEMO_ID                                            
       (NAME,ADDRESS,DATEOFBIRTH,SALARY)                           
       VALUES                                                      
       (:NAME(*),                   /* <-- ARRAY                   
        :ADDRESS(*)                 /* <-- ARRAY                   
        INDICATOR :N§ADDRESS(*)     /* <-- ARRAY                   
        LINDICATOR :L§ADDRESS(*),   /* <-- ARRAY DB2 VCHAR         
        :DATENATD(1:10),            /* <-- ARRAY NATURAL DATES     
        :SALARY(01:10)              /* <-- ARRAY NATURAL PACKED    
       )                                                           
       FOR :ROWCOUNT ROWS                                          
SELECT * INTO VIEW V1 FROM NAT-DEMO_ID WHERE NAME > 'Z'            
DISPLAY V1                          /* <-- VERIFY INSERT           
END-SELECT                                                         
END