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> ... ] ) ]
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 コマンドを使用した例です。

文字列リテラルの実行

この例では、文字列リテラルで定義されたステートメントを実行します。

EXECUTE IMMEDIATE 'SELECT PI()';
Copy
+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+

セッション変数でのステートメント実行

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

SET stmt =
$$
    SELECT PI();
$$
;
Copy
EXECUTE IMMEDIATE $stmt;
Copy
+-------------+
|        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;
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                              |
+----------------------------------+

SnowSQL または従来のコンソールにおける匿名ブロックの実行

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 |
+-----------------+

バインド変数を使用したステートメントの実行

この例では、 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);
Copy

そして、ブロックを実行します。

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

注: SnowSQLClassic Consoleexecute_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;
$$
;
Copy
+----+-------+
| ID | PRICE |
|----+-------|
|  2 | 22.22 |
+----+-------+