EXECUTE IMMEDIATE

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

構文

EXECUTE IMMEDIATE '<string_literal>'
    [ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;

EXECUTE IMMEDIATE <variable>
    [ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;

EXECUTE IMMEDIATE $<session_variable>
    [ USING (bind_variable_1 [, bind_variable_2 ...] ) ] ;

条件:

文字列リテラル . 変数 . セッション変数

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

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

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

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

  • ブロック

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

バインド変数

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

戻り値

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

使用上の注意

  • 文字列リテラル変数、または セッション変数 には、ステートメントを1つだけ含める必要があります。(ブロック は、ブロックの本文に複数のステートメントが含まれている場合でも、1つのステートメントと見なされます。)

  • セッション変数 の前には、ドル記号($)を付ける必要があります。

  • ローカルの 変数 の前に、ドル記号($)を付けることは できません

基本的な例

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

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

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

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

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

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

注: SnowSQL または 従来のウェブインターフェイス を使用している場合は、代わりに次の例を使用します(SnowSQL での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;
$$
;