Hitachi

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


4.20.1 EXECUTE文 形式2の形式と規則

〈この項の構成〉

(1) 機能

PREPARE文で前処理したSQLを,配列を使用して複数行分一括して実行します。

(2) 使用権限

なし。

(3) 形式2 <前処理したSQL(INSERT文,UPDATE文,又はDELETE文)の複数行分又は複数回分の一括実行>

 EXECUTE {SQL文識別子|拡張文名}
     {USING :埋込み変数配列〔:標識変数配列〕
           〔,:埋込み変数配列〔:標識変数配列〕〕…
      |USING DESCRIPTOR 〔:〕SQL記述領域名
                      〔CHARACTER_SET〔:〕文字集合名記述領域名〕}
     BY :埋込み変数〔ROWS〕

(4) オペランド

(a) {SQL文識別子|拡張文名}

SQL文識別子

PREPARE文で前処理したSQLに付けられたSQL文識別子を指定します。

拡張文名

PREPARE文で前処理したSQL文を識別する拡張文名を指定します。

拡張文名については,「拡張文名」を参照してください。

(b) USING :埋込み変数配列〔:標識変数配列〕〔,埋込み変数配列〔:標識変数配列〕〕…

埋込み変数配列

PREPARE文で前処理した,SQLに含まれる入力?パラメタの値を埋込み変数で与える場合に,入力?パラメタに与える値を持つ配列形式の埋込み変数を指定します。

USING句で指定する埋込み変数配列の数と,EXECUTE文で実行するSQLに含まれる入力?パラメタの数を同じにしてください。なお,埋込み変数配列と入力?パラメタは,それぞれの並びの順に先頭から対応付けられます。

USING句で指定する埋込み変数配列のデータ型は,対応する入力?パラメタに対して許されるデータ型にしてください。

標識変数配列

埋込み変数の値が,ナル値かどうかを示す配列形式の標識変数を指定します。

標識変数配列は,SMALLINTのデータ型を持つ配列形式の埋込み変数として,埋込みSQL宣言節で宣言してください。

標識変数配列を省略した場合は,埋込み変数配列の値はナル値以外と仮定されます。

(c) USING DESCRIPTOR 〔:〕SQL記述領域名〔CHARACTER_SET 〔:〕文字集合名記述領域名〕

SQL記述領域名

PREPARE文で前処理した,SQLの入力?パラメタの値をSQL記述領域を用いて与えるときに,その入力?パラメタの値を与えるための変数を記述した,SQL記述領域の名称を指定します。

文字集合名記述領域名

PREPARE文で前処理した,SQLの入力?パラメタの値をSQL記述領域を用いて与えるときに,その入力?パラメタの値を与えるための変数の文字集合名を記述した,文字集合名記述領域の名称を指定します。

文字集合名記述領域については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(d) BY :埋込み変数〔ROWS〕

埋込み変数

PREPARE文で前処理したSQL文がINSERT文の場合,処理(挿入)する行数を設定します。PREPARE文で前処理したSQL文がUPDATE文又はDELETE文の場合,処理(更新又は削除)を実行する回数を設定した埋込み変数を指定します。

SMALLINT型の埋込み変数を指定してください。

指定できる値の範囲を次に示します。

  • オペランドに"USING :埋込み変数配列〔:標識変数配列〕〔,:埋込み変数配列〔:標識変数配列〕〕…"を指定する場合

    値の範囲は,1〜4,096です。

  • オペランドに"USING DESCRIPTOR 〔:〕SQL記述領域名"を指定する場合

    値の範囲は,1〜30,000です。

0,及び負の値は設定できません。範囲外の値を設定した場合は,実行時にエラーとなります。

ROWは指定してもしなくても意味は変わりません。

(5) 共通規則

  1. EXECUTE文で実行するSQLは,PREPARE文で前処理しておく必要があります。

  2. EXECUTE文の形式2は,PREPARE文で前処理したSQL文が次に示すINSERT文,UPDATE文,又はDELETE文の場合にだけ使用できます。

    • INSERT INTO 〔認可識別子.〕表識別子 〔(列名〔,列名〕…)〕

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

      | 問合せ式本体 }

      〔WITH ROLLBACK〕

    • INSERT INTO 〔認可識別子.〕表識別子(ROW)

      {VALUES(:埋込み変数配列〔:標識変数配列〕)

      |問合せ式本体 }

      〔WITH ROLLBACK〕

    • UPDATE 〔認可識別子.〕表識別子 〔〔AS〕相関名〕

      〔使用インデクスのSQL最適化指定〕

        SET{更新対象=更新値

          |(更新対象,更新対象〔,更新対象〕)=行副問合せ}

          〔,{更新対象=更新値

            |(更新対象,更新対象〔,更新対象〕…)=行副問合せ}〕…

      〔WHERE探索条件〕

      〔WITH ROLLBACK〕

    • UPDATE 〔認可識別子.〕表識別子 〔〔AS〕相関名〕

      〔使用インデクスのSQL最適化指定〕

      SET ROW=行更新値

      〔WHERE探索条件〕

      〔WITH ROLLBACK〕

    • DELETE FROM 〔認可識別子.〕表識別子

      〔〔AS〕相関名〕

      〔使用インデクスのSQL最適化指定〕

      〔WHERE探索条件〕

      〔WITH ROLLBACK〕

    PREPARE文で前処理したSQL文が上記の形式でない場合,実行時にエラーとなります。

  3. PREPARE文と,そのPREPARE文で前処理したSQLを実行するEXECUTE文は,同じトランザクション内で実行してください。

  4. SQL文識別子は,埋込み変数と同様に,コンパイル単位のファイル内で有効な名前であり,同じSQL文識別子に対する複数のSQLを,複数のモジュールにわたって使用できません。

  5. オペランドに"USING :埋込み変数配列〔:標識変数配列〕〔,:埋込み変数配列〔:標識変数配列〕〕…"を指定する場合,次の規則に従ってください。

    • 埋込み変数配列,及び標識変数配列の要素数は,1〜4,096の範囲にしてください。範囲外の値を指定した場合はエラーとなります。

    • 埋込み変数配列,及び標識変数配列の要素数は,"BY :埋込み変数〔ROWS〕"で指定する行数の最大値以上になるようにしてください。

  6. オペランドに"USING DESCRIPTOR 〔:〕SQL記述領域名"を指定する場合,次の規則に従ってください。

    • SQL記述領域名で指定した,SQL記述領域のSQLDATAが指す領域に,入力?パラメタの値を設定する場合は,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。このとき,配列の要素数は,"BY :埋込み変数〔ROWS〕"で指定する行数の最大値以上になるようにしてください。

    • SQL記述領域名で指定したSQL記述領域のSQLSYS領域に,データ型に応じた値を設定してください。

      ・可変長文字列(VARCHAR,NVARCHAR,又はMVARCHAR)の場合は,文字列の長さを格納する領域と境界調整によって生じる要素間のギャップも含めた1要素分の長さを設定してください。

      (例)

      C言語では,次のようなVARCHAR型の配列変数の場合,SQLSYSに設定する値は,sizeof( vchr[0])となります。

       struct {

         short len;

         char str[257];

       } vchr[128];

      ・ほかのデータ型の場合は,0を設定してください。

  7. BLOB型,最大長が32,001バイト以上のBINARY,及び抽象データ型は指定できません。

  8. USING句に指定した埋込み変数配列が既定文字集合の文字データ型で,かつ入力?パラメタの文字集合と異なる場合,自動的に入力?パラメタの文字集合に変換します。

(6) 留意事項

  1. PREPARE文で前処理した一つのSQLに対して,EXECUTE文は何回でも実行できます。

  2. EXECUTE文形式2では,"BY :埋込み変数"で指定する行数分の処理をするため,埋込み変数配列,標識変数配列,又は入力?パラメタの値を設定する,SQLDATAが指す領域には,必ず指定する行数分の値を設定しておいてください。

(7) 使用例

  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;
     
    EXEC SQL
      PREPARE PRESQL FROM
          'INSERT INTO ZAIKO(SCODE, SNAME) VALUES (?, ?)';
     
                     :
        各変数配列の要素に値を設定
                     :
     
    XINSERT_NUM = 50;
    EXEC SQL
      EXECUTE PRESQL USING :XSCODE:ISCODE, :XSNAME:ISNAME
          BY :XINSERT_NUM ROWS;
  2. C言語の配列変数に設定した商品コード(SCODE)及び在庫量(ZSURYO)の値別に,在庫量(ZSURYO)を次の表で示す値に更新します。

    表4‒5 表に格納された商品コードと在庫量(更新前)

    商品コード

    在庫量の更新値

    '101M'

    40

    '101L'

    70

    '201M'

    15

    '202M'

    28

    '302S'

    7

    表4‒6 更新対象となる行の商品コードと在庫量(埋込み変数配列に設定)

    商品コード

    在庫量の更新値

    '101M'

    35

    '101L'

    62

    '201M'

    13

    '202M'

    10

    '302S'

    6

    表4‒7 表に格納された商品コードと在庫量(更新後)

    商品コード

    在庫量の更新値

    '101M'

    35

    '101L'

    62

    '201M'

    13

    '202M'

    10

    '302S'

    6

    EXEC SQL BEGIN DECLARE SECTION;
          short   XUPDATE_NUM;
          char    XSCODE[5][5];
          short   ISCODE[5];
          long    XZSURYO[5];
          short   IZSURYO[5];
    EXEC SQL END DECLARE SECTION;
    EXEC SQL
    PREPARE PRESQL FROM
          'UPDATE ZAIKO SET ZSURYO = ? WHERE SCODE = ?';
        ・・・各変数配列の要素に値設定・・・
            XSCODEに{'101M','101L','201M','202M','302S'}を設定
            XZSURYOに{35,62,13,10,6}を設定
    XUPDATE_NUM = 5;
    EXEC SQL
    EXECUTE PRESQL USING :XZSURYO:IZSURYO, :XSCODE:ISCODE
    BY :XUPDATE_NUM