EXECUTE IMMEDIATE¶
Führt eine Zeichenfolge aus, die eine SQL-Anweisung oder eine Snowflake Scripting-Anweisung enthält.
Mit EXECUTE IMMEDIATE können Sie Folgendes tun:
Führen Sie in einem Snowflake Scripting-Block dynamisches SQL aus, bei dem Teile der SQL-Anweisung erst zur Laufzeit bekannt sind. Weitere Beispiele finden Sie unter Ausführen von dynamischem SQL in einem Snowflake Scripting-Block.
Legen Sie eine Sitzungsvariable auf eine SQL-Anweisung fest und verweisen Sie auf die Sitzungsvariable, um die SQL-Anweisung auszuführen. Ein Beispiel dazu finden Sie unter Eine Sitzungsvariable auf eine Anweisung setzen und diese ausführen.
If you are using SnowSQL or Snowsight, run a Snowflake Scripting anonymous block. For an example, see Running an anonymous block in SnowSQL or Snowsight.
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> ... ] ) ]
Erforderliche Parameter¶
'string_literal'oder .variableoder .session_variableEin 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, Variablevariableund Sitzungsvariablesession_variabledü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_variablemuss ein Dollarzeichen ($) vorangestellt werden.Einer lokalen
variabledarf kein Dollarzeichen ($) vorangestellt werden.
Beispiele¶
Im Folgenden finden Sie Beispiele für die Verwendung des EXECUTE IMMEDIATE-Befehls.
Ausführen von dynamischem SQL in einem Snowflake Scripting-Block¶
Die folgenden Beispiele führen dynamisches SQL in einem Snowflake Scripting-Block aus.
Ausführen von Anweisungen, die Variablen enthalten¶
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;
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
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;
$$;
Rufen Sie die gespeicherte Prozedur auf:
CALL execute_immediate_local_variable();
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240 |
+----------------------------------+
Ausführen einer Anweisung, die Bindungsvariablen enthält¶
In diesem Beispiel wird EXECUTE IMMEDIATE verwendet, um eine SELECT-Anweisung auszuführen, die Bindungsvariablen im USING-Parameter in einer gespeicherten Snowflake Scripting-Prozedur 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);
Erstellen Sie die gespeicherte Prozedur:
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;
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
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;
$$
;
Rufen Sie die gespeicherte Prozedur auf:
CALL min_max_invoices_sp(20, 30);
+----+-------+
| ID | PRICE |
|----+-------|
| 2 | 22.22 |
+----+-------+
Eine Sitzungsvariable auf eine Anweisung setzen und diese ausführen¶
Im folgenden Beispiel wird eine in einer Sitzungsvariable definierte Anweisung ausgeführt:
SET stmt =
$$
SELECT PI();
$$
;
EXECUTE IMMEDIATE $stmt;
+-------------+
| PI() |
|-------------|
| 3.141592654 |
+-------------+
Running an anonymous block in SnowSQL or Snowsight¶
When you run a Snowflake Scripting anonymous block in SnowSQL or Snowsight, you must specify the block as a string literal (delimited by single quotes or double dollar signs), and you must pass the block to the EXECUTE IMMEDIATE command. For more information, see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector.
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;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 28.274333882 |
+-----------------+