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 'SELECT PI()';
+-------------+
|        PI() |
|-------------|
| 3.141592654 |
+-------------+
Copy

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

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

この例では、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);
        RETURN result::VARCHAR;
     END;
$$;
Copy
CALL execute_immediate_local_variable();
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+
Copy

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

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