EXECUTE IMMEDIATE¶
SQL ステートメントまたは Snowflakeスクリプトのステートメント を含む文字列を実行します。
構文¶
EXECUTE IMMEDIATE '<string_literal>'
[ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;
EXECUTE IMMEDIATE <variable>
[ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;
EXECUTE IMMEDIATE $<session_variable>
[ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;
条件:
string_literal
.variable
.session_variable
ステートメントを含む文字列リテラル、Snowflakeスクリプト 変数、または セッション変数。ステートメントは、次のいずれかになります。
セッション変数を使用する場合、ステートメントの長さは、セッション変数の 最大サイズ(256バイト) を超えてはなりません。
bind_variable
バインド変数は、カーソルのクエリ定義で使用される値を保持します(例:
WHERE
句内)。
戻り値¶
EXECUTE IMMEDIATE
は、実行されたステートメントの結果を返します。たとえば、文字列または変数に SELECT
ステートメントが含まれている場合は、 SELECT
の結果セットが返されます。
使用上の注意¶
string_literal
、variable
、またはsession_variable
には、ステートメントを1つだけ含める必要があります。(ブロック は、ブロックの本文に複数のステートメントが含まれている場合でも、1つのステートメントと見なされます。)session_variable
の前には、ドル記号($
)を付ける必要があります。ローカルの
variable
の前に、ドル記号($
)を付けることは できません。
例¶
基本的な例¶
この例では、文字列リテラルで定義されたステートメントを実行します。
EXECUTE IMMEDIATE 'SELECT PI()'; +-------------+ | PI() | |-------------| | 3.141592654 | +-------------+
この例では、セッション変数で定義されたステートメントを実行します。
SET stmt = $$ SELECT PI(); $$ ;EXECUTE IMMEDIATE $stmt; +-------------+ | PI() | |-------------| | 3.141592654 | +-------------+
この例では、2つのローカル変数で定義されているステートメントを実行します。これは、 EXECUTE IMMEDIATE が文字列リテラルだけでなく、文字列(VARCHAR)に評価される式でも機能することも示しています。
CREATE PROCEDURE execute_immediate_local_variable() RETURNS VARCHAR AS $$ DECLARE v1 VARCHAR DEFAULT 'CREATE TABLE temporary1 (i INTEGER)'; v2 VARCHAR DEFAULT 'INSERT INTO temporary1 (i) VALUES (76)'; result INTEGER DEFAULT 0; BEGIN EXECUTE IMMEDIATE v1; EXECUTE IMMEDIATE v2 || ',(80)' || ',(84)'; result := (SELECT SUM(i) FROM temporary1 ORDER BY i); RETURN result::VARCHAR; END; $$;CALL execute_immediate_local_variable(); +----------------------------------+ | EXECUTE_IMMEDIATE_LOCAL_VARIABLE | |----------------------------------| | 240 | +----------------------------------+
この例では、 EXECUTE IMMEDIATE を使用して、バインドパラメーターを含む SELECT ステートメントを実行します。
DECLARE rs RESULTSET; query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?'; minimum_price NUMBER(12,2) DEFAULT 20.00; maximum_price NUMBER(12,2) DEFAULT 30.00; BEGIN rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price)); RETURN TABLE(rs); END;注: SnowSQL または Classic Console を使用している場合は、代わりに次の例を使用します(SnowSQL および Classic Console でのSnowflakeスクリプトの使用 を参照)。
EXECUTE IMMEDIATE $$ DECLARE rs RESULTSET; query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?'; minimum_price NUMBER(12,2) DEFAULT 20.00; maximum_price NUMBER(12,2) DEFAULT 30.00; BEGIN rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price)); RETURN TABLE(rs); END; $$ ;