EXECUTE ステートメント

EXECUTE ステートメントは、準備済み SQL ステートメントを実行します。

呼びかけ EXECUTE

このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、動的に作成できない実行可能ステートメントです。 Java™では指定できません。

承認 EXECUTE

プリペアドステートメントの作成に必要な権限については、PREPARE文を参照してください。

構文 EXECUTE

構文図を読むビジュアルシンタックスダイアグラムをスキップする EXECUTE statement-name USING,変数1array-variable[ 配列インデックス]2USING DESCRIPTORdescriptor-namesource-row-data3
注:
  • 1 グローバル変数は、SQL PL コンテキストでのみ指定する必要があります。
  • 2 アレイ要素は、SQL PL コンテキストでのみ指定できます。
  • 3 このオプションは、statement-nameが FOR MULTIPLE ROWSで準備された動的INSERTまたはMERGE文を参照し、PREPARE文のATTRIBUTES句の一部として指定されている場合のみ指定できます。

source-row-data:

構文図を読むビジュアルシンタックスダイアグラムをスキップするUSING,ホスト変数配列host-variableUSING DESCRIPTORdescriptor-nameFORhost-variable整数定数ROWS1
注:
  • 1 FOR n ROWS句は、MERGE文の一部として指定されておらず、ホスト変数配列が指定されている場合、EXECUTE文で必要となります。 FOR n ROWS 文節は、MERGE がソース・データの複数行で使用される場合にも 必要です。 INSERT ステートメントの場合、FOR n ROWS 文節は、ただ 1 つの複数行 INSERT ステートメントを含む動的ステートメントに対してのみ指定できます。

説明の対象: EXECUTE

文名
実行する準備済みのステートメントを指定します。 statement-name には作業単位の中で以前に準備されたステートメントを指定する必要があり、準備済みステートメントを select-statement にしてはなりません。
USING
変更の開始FL 500 変数のリストまたは配列要素の指定を導入します。その値は、準備されたステートメント内のパラメーター マーカー (疑問符) に置き換えられます。 (パラメータマーカーの説明については、 PREPARE文を参照してください。) 準備済みステートメントにパラメーター・マーカーが含まれている場合は、 EXECUTE ステートメントに USING を入れなければなりません。 パラメーター・マーカーがなければ、USING は無視されます。

n 番目の値は、 準備済みステートメントの n 番目のパラメーター・マーカーに対応します。 場合によっては、ロケーター変数とファイル参照変数も、パラメーター・マーカーの値のソースとして指定できます。

パラメータマーカーの値の置換については、「パラメータマーカーの置換 」を参照してください。
変数、...
変数とホスト構造体の宣言規則に従って、アプリケーション・プログラムで宣言されている変数またはホスト構造体を指定します。 このステートメントが実行されるときに、構造に対する参照はその 各変数に対する参照に置き換えられます。 変数の数は、準備済みステートメントのパラメーター・マーカーの数と同じでなければなりません。 n 番目の変数は、 準備済みステートメントの n 番目のパラメーター・マーカーに対応します。 場合によっては、ロケーター変数とファイル参照変数も、パラメーター・マーカーの値のソースとして指定できます。 グローバル変数は指定してはなりません。

配列グローバル変数は、SQL PL で EXECUTE ステートメントが発行される場合にのみ指定する必要があります。

配列変数 [ 配列インデックス ]
配列エレメントを識別します。 配列エレメントは、SQL PL で EXECUTE ステートメントが発行される場合にのみ指定する必要があります。
array-variable
配列変数を指定します。
[array-index ]
配列のどのエレメントを使用するかを指定する式。

通常の配列の場合、添字式は INTEGER にキャスト可能でなければならず、NULL 値にすることはできません。 添字の値は、1 から、その配列に定義されている最大カーディナリティーまでの値でなければなりません。

連想配列の場合、配列添字の式は、その連想配列の添字のデータ・タイプにキャスト可能でなければならず、NULL 値であってはなりません。

array-index は、以下のものであってはなりません。

  • CURRENT DATE、CURRENT TIME、または CURRENT TIMESTAMP 特殊レジスターを参照する式
  • 非 deterministic 関数
  • EXTERNAL ACTION を指定して定義された関数
  • MODIFIES SQL DATA を指定して定義された関数
  • シーケンス式
array-variable
配列変数を指定します。
変更の終わり
USING DESCRIPTOR 記述子名
SQLDA を指定します。これは、入力ホスト変数の有効な記述を含んでいます。

EXECUTE ステートメントを呼び出す前に、SQLDA 内の次のフィールドを設定しておく必要があります。

  • SQLDA で提供される SQLVAR オカレンスの数を示す SQLN
  • SQLDA に割り振るストレージのバイト数を示す SQLABC
  • ステートメントの処理時に使われる SQLDA 内の変数の数を示す SQLD
  • 変数の属性を示す SQLVAR 項目

SQLDA は、すべての SQLVAR 項目を入れることができる大きさでなければなりません。 SQLVAR 項目に、LOB 値または LOB に基づく特殊タイプが含まれている場合は、それぞれのパラメーターごとに追加の SQLVAR 項目が必要です。 SQLDAの詳細については、SQLVARの説明とSQLVARエントリの数を確認する方法についての説明が含まれています。SQL記述領域(SQLDA )を参照してください。

SQLD は、ゼロ以上で SQLN 以下の値に設定しなければなりません。 これは、準備済みステートメント内のパラメーター・マーカーの数と 同じでなければなりません。 SQLDA によって n 番目に記述される変数は、準備済みステートメントの n 番目のパラメーター・マーカーに対応します。

REXXのSQLDAには、SQLNフィールドが含まれていません。

C で記述子名を表す方法については、「C または C++ での SQLDA の識別」を参照してください。

source-row-data
準備済みステートメントは、PREPARE ステートメントの ATTRIBUTES 文節の中で FOR MULTIPLE ROWS を指定して準備された INSERT ステートメントまたは MERGE ステートメントであることが必要です。
USING host-variable-array または host-variable
ホスト変数またはホスト変数配列のリストを指定します。その値は、準備された INSERT または MERGE ステートメントのパラメーター・マーカー (疑問符) に置換されます。 INSERT または MERGE ステートメントで指定する列数は、指定するホスト変数またはホスト変数配列の合計数以下でなければなりません。
ホスト変数配列
ホスト変数配列を指定します。これは、ホスト変数配列の宣言規則に従ってアプリケーション・プログラムで定義する必要があります。 構造に対する参照は、構造のそれぞれの変数に対する参照に置き換えられます。 変数の数は、準備済みステートメントのパラメーター・マーカーの数と同じでなければなりません。 n 番目の変数が、準備済みステートメント内 の n 番目のパラメーター・マーカーの値を提供します。

host-variable-array は C/C++、COBOL、および PL/I でサポートされます。 詳細については、 ホスト変数配列を参照のこと。

ホスト変数
ホスト変数の宣言に関する規則に準拠して、アプリケーション・プログラム内で記述する必要がある変数を指定します。
DESCRIPTOR ディスクリプタ名
挿入する値が入っているホスト変数配列またはホスト変数の有効な記述が入っていなければならない SQLDA を識別します。

動的 INSERT ステートメントまたは動的 MERGE ステートメントに対して EXECUTE ステートメントを呼び出す前に、SQLDA 内の次のフィールドを設定しておく必要があります。

  • SQLDA で提供される SQLVAR 項目の数を示す SQLN。
  • SQLDA に割り振るストレージのバイト数を示す SQLABC。
  • INSERT ステートメントまたは MERGE ステートメントのソースの列に値を提供するために SQLDA 内で使用される変数の数に、1 を加えた数を示す SQLD。 SQLD は、ゼロ以上で SQLN 以下の値に設定しなければなりません。
  • INSERT ステートメントまたは MERGE ステートメントのソース列に提供された値に対応する SQLVAR 項目の、ホスト変数配列のエレメントの属性を示す SQLVAR 項目。 それぞれの SQLVAR では、以下のフィールドを設定します。
    • SQLTYPE は、ホスト変数配列のエレメントのデータ型を示します。
    • SQLDATAは、対応するホスト変数配列を指します。
    • SQLLEN と SQLLONGLEN は、配列の単一エレメントの長さを示します。
  • SQLNAME。5 番目と 6 番目のバイトにはフラグ・フィールドを格納する必要があり、7 番目と 8 番目のバイトには、ホスト変数配列および、(指定した場合には) 対応する標識配列の次元を示す 2 進短精度整数 (ハーフワード) を格納する必要があります。

SQLDA には、値を与えるそれぞれのターゲット列ごとの SQLVAR 項目を格納し、さらに行数を示す追加の SQLVAR 項目を格納するために十分なストレージが必要です。 Db2 システムは、この追加のSQLVARエントリに必要な情報を入力するためのコードを生成します。 各 SQLVAR 項目は、ソース表の列の値を含むホスト変数、ホスト変数配列、またはバッファーを記述します。 最後の SQLVAR 項目には、データの行数が格納されます。 例えば、INSERT ステートメントまたは MERGE ステートメントが ターゲット表の 5 つの列に値を与える場合は、6 つの SQLVAR 項目が必要です。 いずれかの値が LOB 値である場合は、2 倍の数の SQLVAR 項目が必要で、SQLN を SQLVAR 項目の数に設定する必要があります。 このため、INSERT ステートメントまたは MERGE ステートメントがソース表の 5 つの列に値を与える場合に、挿入する値の一部が LOB 値ならば、12 個の SQLVAR 項目が必要です。

行数を示す SQLVAR 項目には、フラグ値も含める必要があります。 詳細は、 基本SQLVARの発生に関するフィールドの説明を参照してください。

SQLDATA と SQLIND のポインターは、対応する配列の先頭に設定します。

n列分

ソースデータの行数を指定します。nホスト変数または整数定数です。 挿入操作またはマージ操作用の値は、USING 節で指定します。

ホスト変数 または 整数定数 は、整数値 Kに割り当てられます。 host-variable を指定する場合は、スケールがゼロの正確な数値タイプでなければならず、標識変数を含めることはできません。 k は、0 から 32767 の範囲内になければなりません。

処理対象のステートメントが、FOR n ROWS 文節を含む動的 INSERT ステートメントまたは MERGE ステートメントである場合、EXECUTE ステートメントに FOR n ROWS を指定することはできません。

注釈 EXECUTE

長すぎるプロセッサー時間:
Db2 SQL文の実行に時間がかかりすぎる場合、その文の実行を停止することができます。 停止した場合はエラーが発生しますが、 そのステートメントを出したアプリケーションが終了することにはなりません。このアプリケーションは、他の SQL ステートメントを出すことができます。
パラメーター・マーカーの置換:
準備済みステートメントが実行される前に、そのステートメント内の各パラメーター・マーカーは実際に、それに対応するホスト変数に置き換えられます。 置換は代入操作であり、ソースはホスト変数の値、ターゲットは Db2 内の変数です。 割り当てルールは、「割り当てと比較」 で列への割り当てについて説明したルールです。 型付きパラメーター・マーカーの場合、ターゲット変数の属性は CAST 指定によって指定されます。 タイプなしパラメーター・マーカーの場合、 ターゲット変数の属性はパラメーター・マーカーのコンテキストに従って決定されます。 パラメータマーカーに影響するルールについては、「パラメータマーカー」 を参照してください。

V は、パラメーター・マーカー P に対応するホスト変数を表します。 V の値は、列に値を割り当てる際の規則に従って、P のターゲット変数に割り当てられます。

  • V はターゲットと互換でなければなりません。
  • V がストリングの場合、その長さはターゲットの長さ属性を超えることはできません。
  • V が数値の場合、 V の整数部分の絶対値はターゲットの整数部分の絶対値の最大を超えることはできません。
  • V の属性がターゲットの属性と同一でない場合、 その値はターゲットの属性に合うように変換されます。
  • ターゲットに NULL を入れられない場合、V は NULL であってはなりません。

準備済みステートメントが実行されると、P の代わりに使用される値は P のターゲット変数の値になります。 例えば、V が CHAR(6) でターゲットが CHAR(8) の場合、P の代わりに使われる値は、V の値の右側に 2 つのブランクを埋め込んだものとなります。

EXECUTE 時に発生するエラー:
ローカル処理およびリモート処理中に、DEFER(PREPARE) と REOPT(ALWAYS)/REOPT(ONCE) のバインド・オプションを指定すると、通常は PREPARE 処理中に出されるエラーが EXECUTE 時に出される可能性があります。
ネイティブ SQL 言語で作成されたデータ定義ステートメントの実行に関する考慮事項:
ネイティブ SQL 言語で作成されたデータ定義ステートメントは、1 回だけ実行できます。 複数回データ定義ステートメントを実行するには、データ定義ステートメントに関する EXECUTE ステートメントを使用するたびに、その前に PREPARE ステートメントを発行します。

EXECUTE

例 1
この例では、パラメータ・マーカーを持つ INSERT ステートメントが準備され、実行されます。 S1、 DSN8C10. DEPT の形式に対応する構造です。
   EXEC SQL PREPARE DEPT_INSERT FROM
     'INSERT INTO DSN8C10.DEPT VALUES(?,?,?,?)';
   -- Check for successful execution and read values into S1
   EXEC SQL EXECUTE DEPT_INSERT USING :S1;
例 2
IWH.PROGPARM 表には 9 つの列があるとします。 5 行のデータを IWH.PROGPARM 表に挿入する動的 INSERT ステートメントを準備し、実行します。 挿入する列は配列として指定されます。つまり、列の値はすべてホスト変数配列として EXECUTE ステートメントに指定されます。
STMT = 'INSERT INTO IWH.PROGPARM  (IWHID, UPDATE_BY,UPDATE_TS,NAME,
                                   SHORT_DESCRIPTION, ORDERNO, PARMDATA, 
                                   PARMDATALONG, VWPROGKEY)  
VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? )';  
ATTRVAR = 'FOR MULTIPLE ROWS';
EXEC SQL PREPARE INS_STMT ATTRIBUTES :ATTRVAR FROM :STMT;
NROWS = 5;
EXEC SQL EXECUTE INS_STMT FOR :NROWS ROWS 
           USING :V1, :V2, :V3, :V4, :V5, :V6, :V7, :V8, :V9; 

この例では、USING 文節にあるそれぞれのホスト変数が、INSERT ステートメントのターゲットの対応する列に対する値の配列を示します。

例 3
従業員の行に動的に提供される値を使用して、既存の従業員のデータの場合はマスタ EMPLOYEE 表を更新し、新しい従業員のデータの場合は新しい行を挿入します。
hv_stmt = 
  "MERGE INTO EMPLOYEE AS T
    USING (VALUES (CAST (? AS CHAR(6)), CAST (? AS VARCHAR(12)),
                  CAST (? AS CHAR(1)), CAST (? AS VARCHAR(15)),
                  CAST (? AS INTEGER)))
    AS S (EMPNO, FIRSTNAME, MI, LASTNAME, SALARY)
    ON T.EMPNO = S.EMPNO
    WHEN MATCHED THEN UPDATE
        SET SALARY = S.SALARY
    WHEN NOT MATCHED THEN INSERT (EMPNO, FIRSTNAME, MI, LASTNAME, SALARY)
        VALUES (S.EMPNO, S.FIRSTNAME, S.MI, S.LASTNAME, S.SALARY)
    NOT ATOMIC CONTINUE ON SQLEXCEPTION";
hv_attr = 'FOR MULTIPLE ROWS';
EXEC SQL 
    PREPARE merge_stmt 
     ATTRIBUTES :hv_attr FROM :hv_stmt;
hv_nrows = 5;
/* Initialize the hostvar array of hv_empno, hv_firstname... */
EXEC SQL 
   EXECUTE merge_stmt 
   USING :hv_empno, :hv_firstname, :hv_mi, 
         :hv_lastname, :hv_salary
      FOR :hv_nrows ROWS;
例 4

以下の配列タイプ、配列変数、およびテーブルが定義されているとします。

CREATE TYPE INTARRAY AS INTEGER ARRAY[100];
CREATE TYPE STRINGARRAY AS VARCHAR(10) ARRAY[100];
CREATE TABLE T1 (COL1 CHAR(10), COL2 INT);

EXECUTE ステートメント内で式の入力値として配列変数を使用します。

CREATE PROCEDURE PROCESSPERSONS (OUT WITHO STRINGARRAY, INOUT INT0 INT)
BEGIN
 DECLARE INTA INTARRAY;
 DECLARE STMT CHAR(100);
-- Initialize the array
 SET INTA = ARRAY[1,INTEGER(2),3+0,4,5,6] ;
-- Use dynamic sql with an array parameter marker to
--  provide a value for a dynamic INSERT statement
 SET STMT = 'INSERT INTO T1 VALUES('XYZ', CARDINALITY(CAST(? AS INTARRAY)))';
 PREPARE INS_STMT FROM STMT;
 EXECUTE INS_STMT USING INTA; 
-- INTA is an array variable used as input for the 
-- INSERT statement
…
END