EXECUTE IMMEDIATE

EXECUTE IMMEDIATE ステートメントは、PREPARE ステートメントと EXECUTE ステートメントの基本機能を結合したものです。 このステートメントは、変数もパラメーター・マーカーも含まない SQL ステートメントを準備し、 実行するのに使用することができます。

EXECUTE IMMEDIATE ステートメントは、以下の処理を行います。

  • 文字ストリング形式の SQL ステートメントをもとにして、そのステートメントの実行可能形式を準備する
  • その SQL ステートメントを実行する

呼び出し

このステートメントは、アプリケーション・プログラム、SQL 関数、 SQL プロシージャー、またはトリガー内にのみ組み込むことができます。 これは実行可能ステートメントですが、動的に準備することはできません。Java™ では指定できません。

権限

ステートメントでグローバル変数を参照する場合は、ステートメントの権限 ID が保持する特権に、少なくとも次のいずれか 1 つが含まれなければなりません。

  • ステートメント内で識別されるグローバル変数に対して、
    • そのグローバル変数に対する READ 特権
    • そのグローバル変数を含むライブラリーに対する *EXECUTE システム権限
  • データベース管理者権限

権限の規則は、EXECUTE IMMEDIATE により指定される SQL ステートメントに対する規則が適用されます。 例えば、EXECUTE IMMEDIATE を使用して INSERT ステートメントを実行する場合に適用される権限規則については、 INSERTを参照してください。

プログラムの作成時点の CRTSQLxxx コマンドに DYNUSRPRF(*OWNER) が指定されていた場合を除き、ステートメントの権限 ID は、実行時の権限 ID です。詳しくは、権限 ID と権限名を参照してください。

構文

構文図を読む構文図をスキップする
>>-EXECUTE IMMEDIATE--+-variable---+---------------------------><
                      '-expression-'   

説明

variable
変数を指定します。この変数は、文字ストリングまたは Unicode グラフィック変数を宣言する規則に従って宣言されていなければなりません。この変数に、標識変数を指定してはなりません。
expression
集約関数または列名を含まない、で説明されているタイプの。 これは、文字ストリングまたは Unicode グラフィック・ストリングの 値を戻す必要があります。 の中に 変数が指定される場合、その変数の CCSID は 65535 であってはなりません。1

指定された変数または式の値は、ステートメント・ストリング と呼ばれます。

ステートメント・ストリングは、以下の SQL ステートメント のいずれかである必要があります。3

ステートメント・ストリングは、次のようなストリングであってはなりません。

  • EXEC SQL で始める。
  • END-EXEC またはセミコロンで終了する。
  • 変数への参照を含むストリング。グローバル変数を使用できます。
  • パラメーター・マーカーを含むストリング。

EXECUTE IMMEDIATE ステートメントを実行すると、指定したステートメント・ストリングが解析され、 エラーの有無が検査されます。 SQL ステートメントとして正しくない場合は、そのステートメントは実行されず、 実行を妨げているエラー条件が独立の SQLSTATE および SQLCODE で報告されます。 SQL ステートメントとして正しくても、ステートメントの実行時にエラーが発生すると、 そのエラー条件が独立の SQLSTATE および SQLCODE に報告されます。 エラーに関する追加情報は、SQL 診断領域 (または SQLCA) から検索できます。

注記

パフォーマンスの考慮: 同じ SQL ステートメントを複数回実行する場合には、EXECUTE IMMEDIATE ステートメントより、PREPARE ステートメントと EXECUTE ステートメントを使った方が効率的です。

C を使用して、変数 Qstring 内の SQL ステートメントを実行します。

void main () 
  {
   
    EXEC SQL  BEGIN DECLARE SECTION  END-EXEC.

    char Qstring[100] = "INSERT INTO WORK_TABLE SELECT * FROM EMPPROJACT 
     WHERE ACTNO >= 100"; 

    EXEC SQL  END DECLARE SECTION  END-EXEC.
    EXEC SQL  INCLUDE SQLCA;
  .
  .
  .
    EXEC SQL EXECUTE IMMEDIATE :Qstring;
  
    return;
  }

1 PL/I プログラム内では、PL/I ストリング 式も指定できます。
2 SET 変数ステートメント のターゲットは、グローバル変数である必要があります。
3 選択ステートメント は 許可されません。選択ステートメントを動的に処理するには、PREPARE、DECLARE CURSOR、および OPEN ステートメントを使用します。