INSERT(SQL)

一般セットの構文:

INSERT INTOtable-name

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

拡張セットの構文:

INSERT INTOtable-name

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

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

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

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


関数

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

構文説明

構文要素 説明
INTO table-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 節」を参照してください。

OVERRIDING USER VALUE
OVERRIDING USER VALUE 節:

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

この節は現在はサポートされていません。使用すると、コンパイラエラーが発生します。

VALUES 節

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

アスタリスク指定の VALUES 節

VALUES (VIEWview-name)

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

列リスト指定の VALUES 節

VALUES (

VIEW view-name
insert-item-list

)

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

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

VALUE-LIST

一般セットの構文:

VALUES

(VIEWview-name)
(insert-item-list)

[FOR-n-ROWS-clause]

拡張セットの構文:

VALUES

(VIEWview-name)
(insert-item-list)

[FOR-n-ROWS-clause]

[WITH_CTEcommon-table-expression,...] select-expression

WITH

RR
RS
CS

[QUERYNOinteger]

構文の説明:

構文要素 説明
VIEW view-name
ビュー名:

このビューのフィールド値により、ビューのフィールド名を列名として使用して、新しい行が指定したテーブルに挿入されます。

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)
...
FOR-n-ROWS-clause
FOR n Rows 節:

オプションの節。下記の「FOR-n-ROWS-Clause」を参照してください。

WITH_CTE common-table-expression
WITH_CTE 節:

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

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

詳細については、「SELECT - SQL」の「WITH_CTE common-table-expression」を参照してください。

select-expression
複数行の INSERT:

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

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

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

例 - 複数行の挿入:

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

注意:
実際に挿入された行の数は、システム変数 *ROWCOUNTで確認できます。

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

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

この節では、挿入する行を検索するときに使用する分離レベルを明示的に指定できます。DB2 データベースにのみ有効です。他のデータベースに使用すると、ランタイムエラーが発生します。

CS カーソルの安定
RR 繰り返し可能な読み込み
RS 読み込みの安定
QUERYNO_integer
QUERYNO 節:

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

この節は、現在はサポートされていないため無視されます。

FOR-n-ROWS-Clause

FOR

[:]_host-variable
integer

ROWS [atomic-clause]

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

FOR [:]hostvariable/integer ROWS 節

FOR

[:]_host-variable
integer

ROWS

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

  • コンパイラオプション DB2ARRY が指定されている

  • 複数の行が VALUES 節insert-item-list で指定した配列から挿入される

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

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

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

ATOMIC 節

ATOMIC
NOT ATOMIC CONTINUE ON SQLEXCEPTION

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

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

  • コンパイラオプション DB2ARRY が指定されている

  • 複数の行が VALUES 節insert-item-list で指定した配列から挿入される

構文の説明:

構文要素 説明
ATOMIC エラーが発生した場合は、ターゲットテーブルに行を挿入しないことを指定します。

これはデフォルト値です。

NOT ATOMIC CONTINUE ON SQLEXCEPTION エラーが発生した場合は、エラーのないすべての行を挿入し、エラーのある行を DB2 で破棄することを指定します。

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

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