13.28 EXECUTE IMMEDIATE文
EXECUTE IMMEDIATE文は、動的SQL文を一度の操作で作成して実行します。
システム固有の動的SQLでは、EXECUTE IMMEDIATE文を使用してほとんどの動的SQL文を処理します。
注意:
動的SQLを使用する場合は、セキュリティ・リスクのSQLインジェクションに注意してください。SQLインジェクションの詳細は、「SQLインジェクション」を参照してください。
ここでのトピック
構文
execute_immediate_statement ::=
(bulk_collect_into_clause ::=、dynamic_returning_clause ::=、into_clause ::=)
using_clause ::=
セマンティクス
execute_immediate_statement
dynamic_sql_stmt
SQL文を表す文字列リテラル、文字列変数または文字列式です。その型は、CHAR型、VARCHAR2型またはCLOB型である必要があります。
注意:
dynamic_sql_statementがSELECT文の場合、into_clauseとbulk_collect_into_clauseの両方を省略すると、execute_immediate_statementは実行されません。
たとえば、次の文では順序を増分しません。
EXECUTE IMMEDIATE 'SELECT S.NEXTVAL FROM DUAL'
into_clause
文によって戻される列値を格納する変数またはレコードを指定します。この句の詳細は、「RETURNING INTO句」を参照してください。
into_clauseの制限
dynamic_sql_stmtが単一の行を返す場合にのみ使用します。
bulk_collect_into_clause
文によって戻される行を格納する1つ以上のコレクションを指定します。この句の詳細は、「RETURNING INTO句」を参照してください。
bulk_collect_into_clauseの制限
dynamic_sql_stmtが複数の行を返すことができる場合にのみ使用します。
dynamic_returning_clause
動的SQL文によって影響を受ける行の列値を個々の変数またはレコードのいずれかに戻します。この句の詳細は、「RETURNING INTO句」を参照してください。
dynamic_returning_clauseの制限
dynamic_sql_stmtがRETURNING INTO句を持つ場合にのみ使用します。
using_clause
位置表記法を使用して、バインド変数を指定します。
注意:
dynamic_sql_statement内でプレースホルダ名を繰り返す場合は、プレースホルダをバインド変数に関連付ける方法が動的SQL文の種類によって異なるということに注意してください。詳細は、「動的SQL文内でのプレースホルダ名の繰返し」を参照してください。
using_clauseの制限
-
dynamic_sql_stmtにバインド変数用のプレースホルダが含まれている場合にのみ使用します。 -
dynamic_sql_stmtにRETURNINGINTO句(static_returning_clause)がある場合は、using_clauseにはINバインド変数のみを含めることができます。定義上、RETURNINGINTO句のバインド変数はOUTバインド変数です。
IN、OUT、IN OUT
バインド変数のパラメータ・モード。INバインド変数は、その値をdynamic_sql_stmtに渡します。OUTバインド変数は、dynamic_sql_stmtによって戻される値を格納します。IN OUTバインド変数は、その初期値をdynamic_sql_stmtに渡し、dynamic_sql_stmtによって戻される値を格納します。デフォルト: IN。
RETURNING句を持つDML文の場合は、常にOUTであるパラメータ・モードを指定しなくても、OUTバインド変数をRETURNING INTO句に入れることができます。
bind_argument
実行時に、dynamic_sql_stmt内の対応するプレースホルダのかわりに置き換えられる値を持つ式。
dynamic_sql_stmt内のすべてのプレースホルダをUSING句内またはRETURNING INTO句内(あるいはその両方)のbind_argument、またはINTO句内の定義変数に関連付ける必要があります。
dynamic_sql_stmtは、バインド変数の異なる値を使用して繰り返し実行できます。ただし、EXECUTE IMMEDIATEは実行のたびに動的文字列を準備するため、オーバーヘッドが発生します。
注意:
バインド変数はどのような順序でも評価できます。プログラムにより評価の順序が決定される場合は、プログラムで決定が行われる時点で動作は定義されません。
bind_argumentの制限
-
bind_argumentに、文字列で索引付けされている連想配列は使用できません。 -
bind_argumentに、予約語NULLは使用できません。値
NULLを動的SQL文に渡すには、例7-7で示すように、NULLを使用する場所に未初期化変数を使用します。

