EXECUTE IMMEDIATE¶
SQL ステートメントまたは Snowflakeスクリプトのステートメント を含む文字列を実行します。
EXECUTEIMMEDIATE を使用して次を実行できます。
Snowflake Scriptingブロックでは、 SQL ステートメントの一部がランタイムまでわからない動的 SQL を実行します。例については、 Snowflake Scriptingブロック内での動的 SQL の実行 をご参照ください。
セッション変数に SQL ステートメントを設定し、セッション変数を参照して SQL ステートメントを実行します。例については、 ステートメントへのセッション変数の設定と実行 をご参照ください。
SnowSQL または Classic Console を使用している場合は、Snowflake Scripting匿名ブロックを実行します。例については、 SnowSQL または Classic Console にある匿名ブロックの実行 をご参照ください。
構文¶
EXECUTE IMMEDIATE '<string_literal>'
[ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]
EXECUTE IMMEDIATE <variable>
[ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]
EXECUTE IMMEDIATE $<session_variable>
[ USING ( <bind_variable> [ , <bind_variable> ... ] ) ]
必須パラメーター¶
オプションのパラメーター¶
USING ( bind_variable [ , bind_variable ... ] )
カーソルのクエリ定義(例: WHERE 句内)で使用される値を保持する1つ以上のバインド変数を指定します。
戻り値¶
EXECUTE IMMEDIATE は、実行されたステートメントの結果を返します。たとえば、文字列または変数に SELECT ステートメントが含まれている場合は、 SELECT ステートメントの結果セットが返されます。
使用上の注意¶
string_literal
、variable
、またはsession_variable
には、ステートメントを1つだけ含める必要があります。(ブロック は、ブロックの本文に複数のステートメントが含まれている場合でも、1つのステートメントと見なされます。)session_variable
の前には、ドル記号($
)を付ける必要があります。ローカルの
variable
の前に、ドル記号($
)を付けることは できません。
例¶
以下は、 EXECUTE IMMEDIATE コマンドを使用した例です。
Snowflake Scriptingブロック内での動的 SQL の実行¶
以下の例では、Snowflake Scriptingブロック内で動的 SQL を実行します。
変数を含むステートメントの実行¶
この例では、2つのローカル変数で定義されているステートメントを Snowflake Scriptingストアドプロシージャ で実行します。この例は、 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);
RETURN result::VARCHAR;
END;
注: SnowSQL、 Classic Console、 execute_stream
または execute_string
メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。
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);
RETURN result::VARCHAR;
END;
$$;
ストアドプロシージャを呼び出します。
CALL execute_immediate_local_variable();
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240 |
+----------------------------------+
バインド変数を含むステートメントの実行¶
この例では、 EXECUTE IMMEDIATE を使用して、Snowflake Scriptingストアドプロシージャの USING パラメーターにバインド変数を含む SELECT ステートメントを実行します。まず、テーブルを作成してデータを挿入します。
CREATE OR REPLACE TABLE invoices (id INTEGER, price NUMBER(12, 2));
INSERT INTO invoices (id, price) VALUES
(1, 11.11),
(2, 22.22);
ストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE min_max_invoices_sp(
minimum_price NUMBER(12,2),
maximum_price NUMBER(12,2))
RETURNS TABLE (id INTEGER, price NUMBER(12, 2))
LANGUAGE SQL
AS
DECLARE
rs RESULTSET;
query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?';
BEGIN
rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
RETURN TABLE(rs);
END;
注: SnowSQL、 Classic Console、 execute_stream
または execute_string
メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する を参照)。
CREATE OR REPLACE PROCEDURE min_max_invoices_sp(
minimum_price NUMBER(12,2),
maximum_price NUMBER(12,2))
RETURNS TABLE (id INTEGER, price NUMBER(12, 2))
LANGUAGE SQL
AS
$$
DECLARE
rs RESULTSET;
query VARCHAR DEFAULT 'SELECT * FROM invoices WHERE price > ? AND price < ?';
BEGIN
rs := (EXECUTE IMMEDIATE :query USING (minimum_price, maximum_price));
RETURN TABLE(rs);
END;
$$
;
ストアドプロシージャを呼び出します。
CALL min_max_invoices_sp(20, 30);
+----+-------+
| ID | PRICE |
|----+-------|
| 2 | 22.22 |
+----+-------+
ステートメントへのセッション変数の設定と実行¶
この例では、セッション変数で定義されたステートメントを実行します。
SET stmt =
$$
SELECT PI();
$$
;
EXECUTE IMMEDIATE $stmt;
+-------------+
| PI() |
|-------------|
| 3.141592654 |
+-------------+
SnowSQL または Classic Console にある匿名ブロックの実行¶
SnowSQL または Classic Console で Snowflakeスクリプト の匿名ブロックを実行する場合は、ブロックを文字列リテラル(一重引用符または二重ドル記号で区切る)として指定し、ブロックを EXECUTE IMMEDIATE に渡す必要があります。詳細については、 SnowSQL、 Classic Console、Python ConnectorでSnowflakeスクリプトを使用する をご参照ください。
この例では、 EXECUTE IMMEDIATE コマンドに渡された匿名ブロックを実行します。
EXECUTE IMMEDIATE $$
DECLARE
radius_of_circle FLOAT;
area_of_circle FLOAT;
BEGIN
radius_of_circle := 3;
area_of_circle := PI() * radius_of_circle * radius_of_circle;
RETURN area_of_circle;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 28.274333882 |
+-----------------+