EXECUTE IMMEDIATE

Führt eine Zeichenfolge aus, die eine SQL-Anweisung oder eine Snowflake Scripting-Anweisung enthält.

Syntax

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

Erforderliche Parameter

'string_literal' oder . variable oder . session_variable

Ein Zeichenfolgenliteral, eine Snowflake Scripting-Variable oder eine Sitzungsvariable, das/die eine Anweisung enthält. Folgende Typen von Anweisungen sind möglich:

  • Eine einzelne SQL-Anweisung

  • Ein Aufruf einer gespeicherten Prozedur

  • Eine Ablaufsteuerungsanweisung (z. B. Schleifen oder Verzweigung)

  • Ein Block

Wenn Sie eine Sitzungsvariable verwenden, darf die Länge der Anweisung die maximale Größe für Sitzungsvariablen von 256 Byte nicht überschreiten.

Optionale Parameter

USING ( bind_variable [ , bind_variable ... ] )

Gibt eine oder mehrere Bindungsvariablen an, die Werte enthalten, die in der Abfragedefinition des Cursors verwendet werden sollen (z. B. in einer WHERE-Klausel).

Rückgabewerte

EXECUTE IMMEDIATE gibt das Ergebnis der ausgeführten Anweisung zurück. Wenn die Zeichenfolge oder Variable beispielsweise eine SELECT-Anweisung enthält, wird das Resultset der SELECT-Anweisung zurückgegeben.

Nutzungshinweise

  • Zeichenfolgenliteral string_literal, Variable variable und Sitzungsvariable session_variable dürfen nur eine Anweisung enthalten. (Ein Block wird insgesamt als eine Anweisung betrachtet, auch wenn der Inhalt des Blocks aus mehreren Anweisungen besteht.)

  • Einer session_variable muss ein Dollarzeichen ($) vorangestellt werden.

  • Einer lokalen variable darf kein Dollarzeichen ($) vorangestellt werden.

Beispiele

Im Folgenden finden Sie Beispiele für die Verwendung des EXECUTE IMMEDIATE-Befehls.

Ausführen eines Zeichenfolgenliterals

Im folgenden Beispiel wird eine in einem Zeichenfolgenliteral definierte Anweisung ausgeführt:

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

Ausführen einer Anweisung in einer Sitzungsvariablen

Im folgenden Beispiel wird eine in einer Sitzungsvariable definierte Anweisung ausgeführt:

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

Ausführen von Anweisungen mit Variablen

Im folgenden Beispiel werden Anweisungen ausgeführt, die in zwei lokalen Variablen einer gespeicherten Snowflake Scripting-Prozedur definiert sind. Dieses Beispiel zeigt auch, dass EXECUTE IMMEDIATE nicht nur mit einem Zeichenfolgenliteral funktioniert, sondern auch mit einem Ausdruck, der eine Zeichenfolge ergibt (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

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

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

Ausführen eines anonymen Blocks in SnowSQL oder der klassischen Konsole

Wenn Sie einen anonymen Snowflake Scripting-Block in SnowSQL oder der klassischen Weboberfläche ausführen, müssen Sie den Block als Zeichenfolgenliteral (begrenzt durch einfache Anführungszeichen oder doppelte Dollarzeichen) angeben und an den Befehl EXECUTE IMMEDIATE übergeben. Weitere Informationen dazu finden Sie unter Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor.

In diesem Beispiel wird ein anonymer Block ausgeführt, der an den Befehl EXECUTE IMMEDIATE übergeben wird:

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

Ausführen einer Anweisung mit Bindungsvariablen

In diesem Beispiel wird EXECUTE IMMEDIATE verwendet, um eine SELECT-Anweisung auszuführen, die Bindungsvariablen im USING-Parameter eines Snowflake Scripting-Blocks enthält. Erstellen Sie zuerst die Tabelle, und fügen Sie Daten ein:

CREATE OR REPLACE TABLE invoices (id INTEGER, price NUMBER(12, 2));

INSERT INTO invoices (id, price) VALUES
  (1, 11.11),
  (2, 22.22);
Copy

Führen Sie nun den Block aus:

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

Hinweis: Wenn Sie SnowSQL, die Classic Console oder die execute_stream- oder execute_string-Methode im Python-Konnektor-Code verwenden, benutzen Sie stattdessen das folgende Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL, in der Classic Console und im Python-Konnektor):

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