EXECUTE IMMEDIATE

SQL ステートメントまたは Snowflakeスクリプトのステートメント を含む文字列を実行します。

EXECUTEIMMEDIATE を使用して次を実行できます。

構文

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> ... ] ) ]
Copy

必須パラメーター

'string_literal' または . variable または . session_variable

ステートメントを含む文字列リテラル、Snowflakeスクリプト 変数、または セッション変数。ステートメントは、次のいずれかになります。

  • 単一の SQL ステートメント

  • ストアドプロシージャの呼び出し

  • 制御フローステートメント(例: ループ または 分岐 ステートメント)

  • ブロック

セッション変数を使用する場合、ステートメントの長さは、セッション変数の 最大サイズ(256バイト) を超えてはなりません。

オプションのパラメーター

USING ( bind_variable [ , bind_variable ... ] )

カーソルのクエリ定義(例: WHERE 句内)で使用される値を保持する1つ以上のバインド変数を指定します。

戻り値

EXECUTE IMMEDIATE は、実行されたステートメントの結果を返します。たとえば、文字列または変数に SELECT ステートメントが含まれている場合は、 SELECT ステートメントの結果セットが返されます。

使用上の注意

  • string_literalvariable、または 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;
Copy

注: SnowSQLClassic Consoleexecute_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;
$$;
Copy

ストアドプロシージャを呼び出します。

CALL execute_immediate_local_variable();
Copy
+----------------------------------+
| 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);
Copy

ストアドプロシージャを作成します。

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;
Copy

注: SnowSQLClassic Consoleexecute_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;
$$
;
Copy

ストアドプロシージャを呼び出します。

CALL min_max_invoices_sp(20, 30);
Copy
+----+-------+
| ID | PRICE |
|----+-------|
|  2 | 22.22 |
+----+-------+

ステートメントへのセッション変数の設定と実行

この例では、セッション変数で定義されたステートメントを実行します。

SET stmt =
$$
    SELECT PI();
$$
;
Copy
EXECUTE IMMEDIATE $stmt;
Copy
+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+

SnowSQL または Classic Console にある匿名ブロックの実行

SnowSQL または Classic ConsoleSnowflakeスクリプト の匿名ブロックを実行する場合は、ブロックを文字列リテラル(一重引用符または二重ドル記号で区切る)として指定し、ブロックを 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;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+