EXECUTE IMMEDIATE¶
SQL ステートメントまたは Snowflakeスクリプトのステートメント を含む文字列を実行します。
構文¶
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 コマンドを使用した例です。
文字列リテラルの実行¶
この例では、文字列リテラルで定義されたステートメントを実行します。
EXECUTE IMMEDIATE 'SELECT PI()';
+-------------+
| PI() |
|-------------|
| 3.141592654 |
+-------------+
セッション変数でのステートメント実行¶
この例では、セッション変数で定義されたステートメントを実行します。
SET stmt =
$$
SELECT PI();
$$
;
EXECUTE IMMEDIATE $stmt;
+-------------+
| PI() |
|-------------|
| 3.141592654 |
+-------------+
変数を使用したステートメントの実行¶
この例では、2つのローカル変数で定義されているステートメントを Snowflakeスクリプト ストアドプロシージャで実行します。この例は、 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 |
+----------------------------------+
SnowSQL または従来のコンソールにおける匿名ブロックの実行¶
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 |
+-----------------+
バインド変数を使用したステートメントの実行¶
この例では、 EXECUTE IMMEDIATE を使用して、 Snowflakeスクリプト ブロックの 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);
そして、ブロックを実行します。
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、 execute_stream
または execute_string
メソッドを Python Connector コードで使用している場合は、代わりにこの例を使用してください(SnowSQL、 Classic Console、Python Connectorで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;
$$
;
+----+-------+
| ID | PRICE |
|----+-------|
| 2 | 22.22 |
+----+-------+