バージョン 4.2.5
 —  ステートメント  —

INSERT - SQL

一般セットの構文:

INSERT INTO table-name

(*) [VALUES-clause]

[(column-list)] VALUE-LIST

拡張セットの構文:

INSERT INTO table-name (*) [OVERRIDING USER VALUE] VALUES(VIEW view-name)

(*) [OVERRIDING USER VALUE] [VALUES-clause]

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

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連機能グループ:「データベースへのアクセスと更新

データベース管理システムインターフェイス』ドキュメントの次のセクションも参照してください。


機能

SQL INSERT ステートメントは、1 つ以上の行をテーブルに新しく追加するために使用します。

Top of page

構文説明

INTOtable-name
INTO 節:

INTO 節では、新しい行を挿入するテーブルを指定します。

詳細については、 table-name を参照してください。

column-list
列リスト:

構文:

column-name... 

column-list には、1 つ以上の column-names を指定できます。これは現在挿入される行内の値とともに指定します。

column-list を指定する場合、列の順序は insert-item-list に指定される値の順序または指定ビュー(下記参照)に含まれる値の順序と一致している必要があります。

column-list を指定しない場合、insert-item-list または指定ビュー内の値がすべての列の暗黙のリストに従ってテーブルに存在する順序で挿入されます。

VALUES-clause
VALUES 節:

VALUES 節を使用して、1 つの行をテーブルに挿入します。 下記の「VALUES 節」を参照してください。

insert-item-list
INSERT 1 行:

insert-item-list には、column-list に指定された列に割り当てる 1 つ以上の値を指定できます。 指定する値の順序が列の順序と一致している必要があります。

column-list を指定しない場合は、insert-item-list 内の値がすべての列の暗黙のリストに従ってテーブルに存在する順序で挿入されます。

insert-item-list に指定できる値は、constantsparametersspecial-registers、または NULL です。

view-nameconstant、および parameter については、「基本構文項目」を参照してください。 special-register の情報も参照してください。

NULL が割り当てられている場合は、指定されたフィールドが値(値 0 または "空白" でも)を受け取らないことを意味します。

例 - INSERT 1 行:

...
INSERT INTO SQL-PERSONNEL (NAME,AGE)
  VALUES ('ADKINSON',35)
...
OVERRIDING USER VALUE
OVERRIDING USER VALUE 節:

この節は SQL 拡張セットに含まれます。

この節により、VALUES 節に指定された値、または GENERATED ALWAYS として定義されている列に対する全選択によって生成された値が無視されるようになります。

VALUES 節

VALUES 節を使用して、1 つの行をテーブルに挿入します。 アスタリスク(*)が指定されているか、または column-list が指定されているかによって、VALUES 節の形式は次のいずれかになります。

アスタリスク指定の VALUES 節

VALUES (VIEWview-name)

アスタリスク表記を指定する場合、VALUES 節にビューを指定する必要があります。 このビューのフィールド値により、ビューのフィールド名を列名として使用して、新しい行が指定したテーブルに挿入されます。

列リスト指定の VALUES 節

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

column-list を指定し、VALUES 節でビューを参照する場合、列リストに指定する項目数は、VALUE-LIST 内のビューに定義されたフィールド数に対応する必要があります。

column-list を指定しない場合は、ビューに定義されたフィールドが、すべての列の暗黙のリストに従って、指定したテーブルに存在する順序で挿入されます。

VALUE-LIST

一般セットの構文:

VALUES

(VIEWview-name)

[FOR-n-ROWS-clause]

(insert-item-list)

拡張セットの構文:

VALUES

(VIEWview-name)

[FOR-n-ROWS-clause]

(insert-item-list)
[WITH_CTE common-table-expression,...] select-expression

WITH

RR

[QUERYNO integer]

RS
CS

構文の説明:

VIEW view-name このビューのフィールド値により、ビューのフィールド名を列名として使用して、新しい行が指定したテーブルに挿入されます。
insert-item-list
INSERT 1 行:

insert-item-list には、列リストに指定された列に割り当てる 1 つ以上の値を指定できます。 指定する値の順序が列の順序と一致している必要があります。

column-list を指定しない場合は、insert-item-list 内の値がすべての列の暗黙のリストに従ってテーブルに存在する順序で挿入されます。

insert-item-list に指定できる値は、定数、パラメータ、特別レジスタ、または NULL です。

view-nameconstant、および parameter については、「基本構文項目」を参照してください。 特別レジスタの情報も参照してください。

NULL が割り当てられている場合は、指定されたフィールドが値(値 0 または空白でも)を受け取らないことを意味します。

例 - INSERT 1 行:

...
INSERT INTO SQL-PERSONNEL (NAME,AGE)
VALUES ('ADKINSON',35)
...
FOR-n-ROWS-clause オプションの節(下記参照)
WITH_CTE common-table-expression

この節は SQL 拡張セットに含まれます。

このオプションの節では、後に続く SELECT ステートメントの任意の FROM 節で参照できる結果テーブルを定義できます。 単一の WITH_CTE キーワードに続けて複数の共通テーブル式を指定できます。 それぞれの共通テーブル式は、後続の共通テーブル式の FROM 節でも参照できます。

詳細については、「SELECT - カーソル指向[WITH CTE common-table-expression,...] 構文)」を参照してください。

select-expression
複数行の INSERT:

この節は SQL 拡張セットに含まれます。

select-expression では、multiple行をテーブルに挿入します。 select-expression が評価されると、結果テーブルの各行は、単一行の INSERT 処理の VALUES 節の値として行に値が指定された場合と同様に扱われます。

詳細については、「選択式」を参照してください。

例 - 複数行の INSERT:

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

注意:
実際に挿入された行の数は、システム変数 *ROWCOUNT(『システム変数』ドキュメントを参照)で確認できます。

WITH RR/RS/CS
WITH 分離レベル節:

この節は SQL 拡張セットに含まれます。

この節では、挿入する行を検索するときに使用する分離レベルを明示的に指定できます。

QUERYNO_integer
QUERYNO 節:

この節は SQL 拡張セットに含まれます。

この節では、このステートメントの EXPLAIN 出力とトレースレコードで使用される番号を明示的に指定します。

FOR-n-ROWS-Clause

FOR

[:]_host-variable

ROWS

ATOMIC

integer NOT ATOMIC CONTINUE ON SQLEXCEPTION

この節は次の副節で構成されます。

FOR [:] hostvariable/integer ROWS 節

FOR

[:]_host-variable

ROWS
integer

この節の指定はオプションです。 指定する必要があるのは、次の場合のみです。

指定する場合、[:]_hostvariable/integer では、VALUES 節insert-item-list に指定した配列から DB2 テーブルに挿入する行の数を決定します(最初のオカレンスから挿入します)。

この節により、ループ内で Natural 配列から行を挿入するプログラムのパフォーマンスが向上します。 この節を使用すると、配列内の行を 1 つの SQL ステートメントで挿入できます。

下記の例を参照してください。

データベース管理システムインターフェイス』ドキュメントの Natural for DB2 に関する説明も参照してください。

ATOMIC 節

ATOMIC

NOT ATOMIC CONTINUE ON SQLEXCEPTION

この節では、複数の行の挿入を DB2 で原子処理として扱うかどうかを指定します。

指定する必要があるのは、次の場合のみです。

構文の説明:

ATOMIC エラーが発生した場合は、ターゲットテーブルに行を挿入しないことを指定します。 これはデフォルト値です。
NOT ATOMIC CONTINUE ON SQLEXCEPTION エラーが発生した場合は、エラーのないすべての行を挿入し、エラーのある行を DB2 で破棄することを指定します。

このような場合に返される SQL コードについては、DB2 SQL REFERENCE を参照してください。

Top of page

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

Top of page