Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


4.28.1 INSERT文 形式3,形式4の形式と規則

〈この項の構成〉

(1) 機能

配列形式の埋込み変数を指定して複数の行の挿入ができます。

形式3

表に,行を列単位で複数行挿入します。

形式4

行全体を一つのデータとみなして,FIX属性の表に,行を行単位で複数行挿入します。

(2) 使用権限

表に対するINSERT権限を持つユーザが,その表に行を挿入できます。

ただし,INSERT 文中に問合せ指定を指定する場合は,その問合せ指定の表に対してSELECT権限が必要です。

(3) 形式3 <埋込み変数配列を指定して,表に列単位で複数行を挿入>

 FOR :埋込み変数
 INSERT INTO 〔認可識別子.〕表識別子
    〔(列名〔,列名〕…)〕
      {VALUES(挿入値〔,挿入値〕…)
      |問合せ式本体 }
    〔WITH ROLLBACK〕
    〔WRITE IMMEDIATE〕
 
 問合せ式本体::={問合せ指定
           |(問合せ式本体)
           |問合せ式本体{UNION|EXCEPT}〔ALL〕
            {問合せ指定|(問合せ式本体)}}
 問合せ指定 ::=SELECT〔{ ALL | DISTINCT}〕{選択式〔,選択式〕…|*}表式
 表式    ::=FROM  表参照〔,表参照〕…
            〔WHERE 探索条件〕
            〔GROUP BY 値式〔,値式〕…〕
            〔HAVING 探索条件〕

(4) 形式4 <埋込み変数配列を指定して,FIX属性の表に行単位で複数行を挿入>

 FOR :埋込み変数
 INSERT INTO 〔認可識別子.〕表識別子(ROW)
   {VALUES(:埋込み変数配列〔:標識変数配列〕)
   | 問合せ式本体 }
   〔WITH ROLLBACK〕
   〔WRITE IMMEDIATE〕
 
 問合せ式本体::={問合せ指定
           |(問合せ式本体)
           |問合せ式本体{UNION|EXCEPT}〔ALL〕
            {問合せ指定|(問合せ式本体)}}
 問合せ指定 ::=SELECT〔{ ALL | DISTINCT}〕{選択式〔,選択式〕…|*}表式
 表式    ::=FROM  表参照〔,表参照〕…
            〔WHERE 探索条件〕
            〔GROUP BY 値式〔,値式〕…〕
            〔HAVING 探索条件〕

(5) オペランド

FOR,VALUES,及びROW以外の説明については,「INSERT文 形式1(行挿入)」,及び「INSERT文 形式2(行挿入)」を参照してください。

(a) <形式3のオペランド>

VALUES(挿入値〔,挿入値〕…)
挿入値

列名で指定した各列に対応した挿入値を指定します。指定できる項目を次に示します。

  • :埋込み変数配列〔:標識変数配列〕

  • 値式

  • NULL(ナル値を表します)

  • DEFAULT

ただし,挿入値には配列形式でない埋込み変数は指定できません。

(b) <形式4のオペランド>

(ROW)

行単位でデータを挿入する場合に指定します。ROWを指定する場合の規則を次に示します。

  1. FIX属性の実表に対してだけ指定できます。ROWは行全体(予備列も含む)を意味し,これを指定することで行全体を一つのデータとして,一つの領域から挿入します。挿入するデータのデータ型は,各列のデータ型に関係なく,ROW型(ROW型に対しては,CHAR(n)〔nは行長〕に対応する変数,又は同じ長さの構造体を指定できます。ただし,構造体中に境界調整による空きがあってはいけません)にしてください。また,データ長は行長(各列のデータ長の総和)にしてください。

  2. UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では,ROWは使用できません。例えば,WindowsのUAPでROWを使用する場合は,HiRDBサーバも同じエンディアンのWindows版を使用してください。

(c) <形式3及び形式4で共通のオペランド>

FOR :埋込み変数

埋込み変数配列を使用して,挿入する行数を設定した埋込み変数を指定します。SMALLINT型の埋込み変数を指定してください。設定値は,1〜4,096の範囲で,かつ埋込み変数配列,及び標識変数配列の要素数以下にしてください。0及び負の値は設定できません。範囲外の値を設定した場合は実行時にエラーとなります。

埋込み変数配列

配列形式で宣言した埋込み変数を指定します。NULL値以外の値を挿入するための配列変数を指定してください。

それぞれの行に挿入する値を,埋込み変数配列の各要素に設定してください。挿入する値にNULL値を含む場合は,埋込み変数配列と標識変数配列を両方指定します。

標識変数配列

配列形式で宣言した標識変数を指定します。埋込み変数配列の各要素に挿入する値がNULL値でないことを示す値を,標識変数配列の対応する要素に設定してください。設定する値については,「標識変数の値の設定」を参照してください。FIX属性の実表には,NULL値を挿入できない点に注意してください。

(6) 共通規則

(a) 形式3の共通規則

  1. 埋込み変数配列のデータ型は,対応する列のデータ型,又は変換できるデータ型にしてください。

  2. 挿入する1行分の列の個数は,列名で指定した列の個数と同じにしてください。また,それらの値は,列のデータ型,又は変換できるデータ型にしてください。

  3. 配列を使用したINSERT文では,BLOB型,最大長が32,001バイト以上のBINARY型,及び抽象データ型は扱えません。

  4. 配列を使用したINSERT文では,繰返し列への挿入はできません。

  5. 固定小数点,又は浮動小数点のデータを,次に示すデータ型の列に挿入する場合,端数(小数)部分は切り捨てられます。

    • INTEGER

    • SMALLINT

    また,固定小数点のデータをDECIMAL型の列に挿入する場合には,列の位取りより下位のけた部分が切り捨てられます。

  6. 表を定義したときに指定した長さ以上の文字データは,挿入できません。

  7. 列に定義されているデータ型の範囲外の数データは,挿入できません。

  8. 固定長文字列(各国文字列,及び混在文字列を含む)の列に挿入するデータが,列の長さより短い場合は,左詰めに挿入され,余りの部分に空白が設定されます。

  9. 文字データ型の列にデータを挿入する場合,挿入対象の列と,対応する挿入値の文字集合を同じにしてください。ただし,挿入値が埋込み変数配列(既定文字集合)の場合,自動的に挿入対象の列の文字集合に変換します。

(b) 形式4の共通規則

  1. 挿入対象の表に,既定文字集合以外の文字データ型の列が存在する場合,行単位のデータ更新はできません。

(c) 形式3及び形式4の共通規則

  1. FOR句以外に埋込み変数配列を一つ以上指定してください。指定しない場合はエラーとなります。

  2. FOR句以外に配列形式でない埋込み変数を指定するとエラーとなります。

  3. 埋込み変数配列,及び標識変数配列の要素数は,1〜4,096の範囲にしてください。範囲外の値を指定した場合はエラーとなります。また,”FOR :埋込み変数”で指定する行数の最大値以上になるようにしてください。

  4. INSERT文形式3は,埋込み変数配列,及び標識変数配列を含むため,PREPARE文で前処理できません。動的に実行する場合については,「EXECUTE文 形式2(配列を使用したSQLの実行)」を参照してください。

  5. 配列を使用したINSERT文は,手続きの中では使用できません。

  6. 挿入するどれかの行で警告する必要のある事象が発生した場合,SQL連絡領域のSQLWARNに警告情報が設定されます。

  7. 挿入するどれかの行でエラーが発生した場合,ロールバックされます。

  8. WITHOUT ROLLBACKを指定した表に対して,INSERT文を実行する場合,インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE(表定義)」のWITHOUT ROLLBACKの規則を参照してください。

  9. 共用表にデータを挿入する場合,事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表にデータ挿入した場合,エラーとなります。共用表に対する更新については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文(表の排他制御)」の留意事項を参照してください。

(7) 参照制約に関する規則

  1. 埋込み変数配列で挿入する場合,又は行単位で挿入する場合の参照制約に関する規則は,「INSERT文 形式1(行挿入)」の参照制約に関する規則を参照してください。

  2. 参照表に行を挿入する場合,外部キー構成列の値が被参照表の主キー構成列の値に含まれるかどうかを確認するため,被参照表を検索します。このとき,被参照表の検索時のデータ保証レベルは共用モードになります。そのため,参照表への行の挿入時,ほかのトランザクションによって被参照表に対する操作が行われている場合は,そのトランザクションが決着されるまで参照表への行の挿入は待ち状態になります。

(8) 使用例

  1. C言語の配列変数に設定した50行分のデータを,在庫表に一括して挿入します。

    EXEC SQL BEGIN DECLARE SECTION;
      short   XINSERT_NUM;
      long    XSCODE[50];
      short   ISCODE[50];
      char    XSNAME[50][17];
      short   ISNAME[50];
    EXEC SQL END DECLARE SECTION;
                :
    各変数配列の要素に値を設定
                :
    XINSERT_NUM = 50;
    EXEC SQL FOR :XINSERT_NUM
        INSERT INTO ZAIKO(SCODE,SNAME)
          VALUES (:XSCODE:ISCODE,:XSNAME:ISNAME);
  2. C言語の配列変数に設定した行全体の値を,在庫表(ZAIKO)に50行分まとめて挿入します。

    EXEC SQL BEGIN DECLARE SECTION;
      short   XINSERT_NUM;
      char    XROWS[50][31];
    EXEC  SQL  END  DECLARE  SECTION;
                 :
    各変数配列の要素に値を設定
                 :
    XINSERT_NUM = 50;
    EXEC  SQL  FOR :XINSERT_NUM
        INSERT INTO ZAIKO(ROW) VALUES(:XROWS);