ページの先頭行へ戻る
Symfoware Server V10.1.1 SQLリファレンス
Symfoware

3.48 INSERT文

機能

表に新しい行を挿入します。

記述形式

問合せ指定

構文の構成

参照項番

権限

一般規則

表名
  • 行を挿入する表の名前を指定します。

  • 表名で指定した表を、問合せ指定のFROM句に指定することはできません。表名がビュー表の場合、そのビュー表に含まれる表が対象になります。

  • 表名で指定した表に、トリガ事象にINSERTを指定したトリガを定義している場合、被トリガSQL文中に指定した表名と同じ表名を副問合せのFROM句に指定することはできません。表名がビュー表の場合、そのビュー表に含まれる表が対象になります。

挿入列リスト
  • 挿入列リストは、表名で指定した表の列を指定します。同じ列を複数回指定することはできません。

  • 挿入列リストを省略した場合、表のすべての列が指定されたとみなされます。

  • 挿入列リストの個数と、挿入値リストの個数または問合せ指定の選択リストの個数は、同じであることが必要です。

  • 挿入列リストが指定された場合、挿入列リストに指定されていない列には、その列の定義で指定されたDEFAULT句の値が設定されます。列の定義でDEFAULT句が指定されていない場合には、NULL値が設定されます。

挿入列リストを指定する例を示します。

INSERT INTO TBL1(COL1,COL3)
       SELECT ACOL,CCOL
       FROM TBL2
       WHERE ACOL = 70

表TBL2の行のうち、WHERE句の条件を満たす2番目の行のACOL、CCOLの値が、表TBL1の指定された列COL1、COL3に挿入されます。このとき指定されなかった列COL2には表定義で指定された既定値が設定されます。もし、表定義でDEFAULT句が指定されていなかった場合は、NULL値が設定されます。ただし、列COL2がNULL値を許さない列である場合はエラーとなります。


VALUES
  • VALUES句を指定した場合、挿入値リストの値が入った1行を表に挿入します。

挿入値リスト
  • NULLを指定した場合、NULL値が設定されます。

  • DEFAULTを指定した場合、その列の定義で指定されたDEFAULT句の値が設定されます。列の定義でDEFAULT句が指定されていない場合には、NULL値が設定されます。

  • 挿入値リストの値式にCURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMPを指定した場合、それぞれ現在の日付、現在の時刻、現在の時刻印が設定されます。

  • 挿入値リストの値式にCURRENT_DATEを指定した場合、挿入する値のデータ型は、DATE型です。

  • 挿入値リストの値式にCURRENT_TIMEを指定した場合、挿入する値のデータ型は、TIME型です。

  • 挿入値リストの値式にCURRENT_TIMESTAMPを指定した場合、挿入する値のデータ型は、TIMESTAMP型です。

  • 挿入値リストに指定する挿入値のデータ型または問合せ指定で示される各列のデータ型は、挿入する表の対応する各列のデータ型にそれぞれ代入可能であることが必要です。代入可能な条件を以下に示します。

    NULLを指定する場合:

    対応する列がNULL値を許していることが必要です。

    列のデータ型が文字列型の場合:

    挿入する値のデータ型は、文字列型であることが必要です。

    列のデータ型が各国語文字列型の場合:

    挿入する値のデータ型は、各国語文字列型であることが必要です。

    列のデータ型が真数型の場合:

    指定される列のデータ型が真数型ならば、挿入する値のデータ型は、真数型または概数型であることが必要です。

    列のデータ型が概数型の場合:

    指定される列のデータ型が概数型ならば、挿入する値のデータ型は、真数型または概数型であることが必要です。

    列のデータ型がDATE型の場合:

    挿入する値のデータ型は、DATE型であることが必要です。ただし、挿入値リストを変数指定で指定する場合は文字列型で指定することが必要です。

    列のデータ型がTIME型の場合:

    挿入する値のデータ型は、TIME型であることが必要です。ただし、挿入値リストを変数指定で指定する場合は文字列型で指定することが必要です。

    列のデータ型がTIMESTAMP型の場合:

    挿入する値のデータ型は、TIMESTAMP型であることが必要です。ただし、挿入値リストを変数指定で指定する場合は文字列型で指定することが必要です。

    列のデータ型が年月クラスの時間隔型の場合:

    挿入する値のデータ型は、年月クラスの時間隔型であることが必要です。ただし、挿入値リストを変数指定で指定する場合は、文字列型または位取り0の真数型で指定することが必要です。位取り0の真数型は、列のデータ型が単一日時フィールドで指定された時間隔の場合のみ指定できます。

    列のデータ型が日時クラスの時間隔型の場合:

    挿入する値のデータ型は、日時クラスの時間隔型であることが必要です。ただし、挿入値リストを変数指定で指定する場合は、文字列型または位取り0の真数型で指定することが必要です。位取り0の真数型は、列のデータ型が単一日時フィールドで指定された時間隔の場合のみ指定できます。

    列のデータ型がBLOB型の場合:

    挿入する値のデータ型は、BLOB型であることが必要です。

  • 表名で指定した表が“WITH CHECK OPTION”を指定したビュー表の場合、挿入する値はビュー表の探索条件に対して真でなければなりません。そうでなければ、例外(WITH CHECK OPTIONに違反)となります。

  • 挿入値が対象列に設定されるときの規則は次のようになります。

    文字列型データの場合:

    挿入値の右側の空白を除くデータ長が対象列の長さと同じ場合は、文字データがそのまま設定されます。挿入値の右側の空白を除くデータ長が対象列の長さよりも短い場合は、挿入値が対象列の左側から設定され、対象列の残り部分には空白が設定されます。挿入値の右側の空白を除くデータ長が対象列の長さよりも長い場合は、データ例外(文字データの右トランケート)となります。

    各国語文字列型の場合:

    文字列型の場合と同じように設定されます。

    真数型の場合:

    対象列のデータ型に変換して設定されます。挿入値の整数部が対象列の精度と位取りで表現できる場合は、対象列の精度と位取りに従って設定されます。上位の桁落ちが発生する場合は例外となり、下位の位が落ちる場合は切り捨てられます。

    概数型のデータの場合:

    対象列には、挿入値の概数値が設定されます。

    日時型のデータの場合:

    対象列のデータ型に変換して設定されます。

    時間隔型のデータの場合:

    対象列のデータ型に変換して設定されます。ただし、時間隔型が年月の場合は年月のデータ型に、時間隔型が日時の場合は日時のデータ型にそれぞれ設定されます。

    BLOB型のデータの場合:

    対象列には、挿入値のバイナリ値が設定されます。

  • INSERT文を被トリガSQL文に指定する場合のみ、挿入値リストの挿入値に列指定を指定することができます。

  • 挿入値リストに指定する値式に集合関数指定を指定することはできません。

  • 挿入値リストに指定する値式にROW_IDを指定することはできません。

FOR

複数行のデータを一括挿入する場合に、挿入する行数を指定します。

SQL埋込みCプログラムの場合
  • VALUES句の挿入値には、ホスト変数定義で配列指定された構造体変数またはポインタ指定された構造体変数を1つ指定します。

  • VALUES句に指定した構造体変数の配列要素数と同じ値をFOR句に指定してください。

  • FOR句に指定する単純値指定のSQLデータ型は、INTEGERまたはSMALLINTとしてください。

  • FOR句を指定する場合、挿入列リストの列名にBLOB型の列は指定できません。

  • ホスト変数定義で配列指定された構造体変数またはポインタ指定された構造体変数に標識変数は指定できません。

  • FOR句を用いたINSERT文は準備可能文としては利用できません。

SQL埋込みCOBOLプログラムの場合
  • VALUES句の挿入値には、集団項目繰り返しホスト変数を1つ指定します。

  • VALUES句に指定した集団項目繰り返しホスト変数の配列要素数と同じ値をFOR句に指定してください。

  • FOR句に指定する単純値指定のSQLデータ型は、INTEGERまたはSMALLINTとしてください。

  • FOR句を指定する場合、挿入列リストの列名にBLOB型の列は指定できません。

  • 集団項目繰り返しホスト変数に標識変数は指定できません。

  • FOR句を用いたINSERT文は準備可能文としては利用できません。

DESCRIBE情報について
  • 挿入値リストに動的パラメタ指定が指定された場合のDESCRIBE情報は、対応する列のデータ型になります。

問合せ指定
  • 問合せ指定を指定した場合、問合せ指定の結果の表すべての行を表に挿入します。

  • 問合せ指定の選択リストに、格納構造がOBJECTのBLOB型の列を指定することはできません。

  • 問合せ指定の導出表にORDER BY句を指定することはできません。

  • 問合せ指定の結果が空ならば、例外(データなし)になります。

  • 挿入する表がOBJECT構造の場合、問合せ指定を指定することはできません。

実行オプション指定
  • 実行オプション指定は、占有モードを指定します。

占有モード指定
  • 占有モード指定は、問合せ指定を指定した場合に、問合せ指定のデータベース資源の占有の方法を指定します。

  • 占有モードを指定したSQL文が読み込んだデータベース資源は、占有モード指定により、以下のようにデータベース資源を占有します。なお、更新する行は占有モード指定にかかわらず、非共有モードでトランザクションの終了までデータベース資源を占有します。

    占有モード指定

    占有の方法

    EXCLUSIVE LOCK

    非共有モードでトランザクション終了までデータベース資源を占有します。

    SHARE LOCK

    共有モードでトランザクション終了までデータベース資源を占有します。

    FREE LOCK

    共有モードでSQL文終了までデータベース資源を占有します。

    NO LOCK

    データベース資源を占有しません。

  • 占有モードを指定したSQL文によって読み込まれた資源は、SET TRANSACTION文で指定された内容にかかわらず、以下のようになります。

    占有モード指定

    読込み水準

    EXCLUSIVE LOCK

    他のトランザクションによって占有されていない行を読み込みます。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることはないため、一度読み込んだ行は他のトランザクションによって更新されないことが保証されます。

    SHARE LOCK

    他のトランザクションによって占有されていないか、または共有モードで資源を占有されている行を読み込みます。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることはないため、一度読み込んだ行は他のトランザクションによって更新されないことが保証されます。

    FREE LOCK

    他のトランザクションによって占有されていないか、または共有モードで資源を占有されている行を読み込みます。当該SQL文で読み込んだ行は、他のトランザクションに更新されることがあるため、同一トランザクションで再検索すると最新の結果を検索することができます。

    NO LOCK

    他のトランザクションでどのような占有をされた資源でも参照することが可能なため、同一トランザクションで再検索すると最新の結果を検索することができます。

  • 占有モードの単位は、R_LOCKがYESの場合は行単位となります。R_LOCKがNOの場合は、ページ単位またはDSI単位の占有になります。

  • 動作環境パラメタにDSO_LOCKを指定したり、環境変数でRDBDSOを指定した場合、占有モードを指定したSQL文は実行できません。

DEFAULT VALUES
  • DEFAULT VALUESが指定された場合、すべての列には、その列の定義で指定されたDEFAULT句の値が設定されます。列の定義でDEFAULT句が指定されていない場合には、NULL値が設定されます。

その他の構文要素

その他の構文要素の説明は、“3.26 DECLARE CURSOR(カーソル宣言)”を参照してください。

使用例

1

挿入する値として問合せ指定を使用する例を示します。

INSERT INTO TBL1
       SELECT *
       FROM TBL2
       WHERE ACOL = 60

表TBL2の行のうちWHERE句の探索条件を満たす行が、表TBL1に挿入されます。問合せ指定の選択リストに“*”が指定されると、FROM句で指定された表のすべての列が指定されたとみなされます。


2

挿入値に集団項目繰り返しホスト変数を指定する例を示します。

SQL埋込みCOBOLプログラム

               :
     EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  01  SQLSTATE     PIC X(5).
  01  SQLMSG       PIC X(255).
  01  G1.
    02 RVAL    OCCURS 10.
      03 HOST1    PIC S9(4) BINARY.
      03 HOST2    PIC S9(4) BINARY.
      03 HOST3    PIC X(10).
     EXEC SQL END DECLARE SECTION END-EXEC.
  PROCEDURE DIVISION.
  
    COMPUTE HOST1 OF RVAL OF G1 (1) = 1.
    COMPUTE HOST1 OF RVAL OF G1 (2) = 2.
               :
    COMPUTE HOST2 OF RVAL OF G1 (1) = 10.
    COMPUTE HOST2 OF RVAL OF G1 (2) = 20.
               :
    MOVE "A" TO HOST3 OF RVAL OF G1(1).
    MOVE "B" TO HOST3 OF RVAL OF G1(2).
               :
    EXEC SQL INSERT INTO S1.T1 VALUES (:G1.RVAL) FOR 10 END-EXEC.
               :

例3

SQL文の実行中のみ参照資源を共用モードで占有する例を示します。

INSERT INTO 在庫管理.在庫表 SELECT * FROM 在庫管理.発注表
        WHERE COL1 = 10
        WITH OPTION LOCK_MODE(FREE LOCK)

例4

COMMITされていない更新中のデータを参照して挿入する例を示します。

INSERT INTO 在庫管理.在庫表 SELECT * FROM 在庫管理.発注表
        WHERE COL1 = 10
        WITH OPTION LOCK_MODE(NO LOCK)