EXECUTE
IMMEDIATE
文は、動的SQL文を一度の操作で作成して実行します。 この文は、システム固有の動的SQLがほとんどの動的SQL文を処理する際に使用する手段です。
構文
execute_immediate_statement ::=
into_clause ::=
bulk_collect_into_clause ::=
using_clause ::=
キーワードとパラメータの説明
bind_argument
値が動的SQL文に渡される式(インバインド)か、または値が動的SQL文に戻される変数(アウトバインド)が格納されます。
この句は、dynamic_sql_stmt
が複数の行を戻す場合にのみ使用され、戻される行を格納する1つ以上のコレクションを指定します。 この句では、dynamic_sql_stmt
の各select_item
に、対応する型互換性のあるcollection_item
または:host_array_name
が必要です。
collection_name
dynamic_sql_stmt
によって戻される行を格納する、宣言されたコレクションの名前。
dynamic_returning_clause
この句は、dynamic_sql_stmt
にRETURNING
INTO
句が含まれている場合にのみ使用され、dynamic_sql_stmt
によって影響を受ける行の列値を、個々の変数またはレコードのいずれかに戻します(行を選択しておく必要はありません)。 この句には、OUT
バインド引数を含めることができます。 詳細は、「RETURNING INTO句」を参照してください。
dynamic_sql_stmt
SQL文を表す1つの文字列リテラル、文字列変数または文字列式です。 CHAR
型、VARCHAR2
型またはCLOB
型である必要があります。
host_array_name
戻された行が格納される配列。 この配列は、PL/SQLホスト環境で宣言して、バインド引数として(コロン(:)接頭辞を付けて)PL/SQLに渡す必要があります。
IN、OUT、IN OUT
バインド引数のパラメータ・モード。 IN
バインド引数は、その値を動的SQL文に渡します。 OUT
バインド引数は、動的SQL文によって戻される値を格納します。 IN
OUT
引数は、その初期値を動的SQL文に渡し、動的SQL文によって戻される値を格納します。 bind_argument
のデフォルト・パラメータ・モードはIN
です。
INTO
この句は、dynamic_sql_stmt
が最大で1つの行を戻すことができるSELECT
文である場合にのみ使用され、戻された行の列値が格納される変数またはレコードを指定します。 dynamic_sql_stmt
の各select_item
に対して、この句は、対応する型互換性のあるdefine_variable
または型互換性のあるrecord
のいずれかを必要とします。
record_name
戻された行が格納されるユーザー定義のレコードまたは%ROWTYPE
レコード。
この句は、dynamic_sql_stmt
にプレースホルダが含まれる場合にのみ使用され、バインド引数のリストを指定します。
variable_name
dynamic_sql_stmt
によって戻される行の列値を格納する定義変数の名前。
使用上の注意
RETURNING
句を持つDML文の場合は、パラメータ・モードOUT
を定義して指定しなくても、OUT
バインド引数をRETURNING
INTO
句に入れることができます。 USING
句とRETURNING
INTO
句の両方を使用する場合、USING
句にはIN
引数のみを含めることができます。
実行時に、バインド引数または定義変数によって、動的SQL文内の対応するプレースホルダが置き換えられます。 すべてのプレースホルダをUSING
句内またはRETURNING
INTO
句内(あるいはその両方)のバインド引数、またはINTO
句内の定義変数に関連付ける必要があります。
バインド行数の値をブール・リテラル(TRUE
、FALSE
、またはNULL
)にすることはできません。 値NULL
を動的SQL文に渡すには、「USING句でのNULL用の未初期化変数」の説明に従って、NULL
を使用する未初期化変数を使用します。
動的SQL文は、バインド引数の新しい値を使用して繰り返し実行できます。 ただし、EXECUTE
IMMEDIATE
は実行のたびに動的文字列を準備するため、オーバーヘッドが発生します。
注意: 動的SQLを使用する場合は、セキュリティ・リスクのSQLインジェクションに注意してください。 SQLインジェクションの詳細は、「PL/SQLでのSQLインジェクションの回避」を参照してください。 |
関連トピック