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_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 ...] ) ] ;

Wobei:

Zeichenfolgenliteral . Variable . Sitzungsvariable

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. Schleife 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.

Bindungsvariable

Eine Bindungsvariable enthält einen Wert, der in der Abfragedefinition des Cursors verwendet wird (z. B. in einer WHERE-Klausel).

Rückgabewerte

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

Nutzungshinweise

  • Zeichenfolgenliteral, Variable oder Sitzungsvariable 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 Sitzungsvariable muss ein Dollarzeichen ($) vorangestellt werden.

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

Beispiele

Grundlegende Beispiele

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

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

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

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

Im folgenden Beispiel werden Anweisungen ausgeführt, die in zwei lokalen Variablen definiert sind. Dies 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 ORDER BY i);
        RETURN result::VARCHAR;
     END;
$$;
CALL execute_immediate_local_variable();
+----------------------------------+
| EXECUTE_IMMEDIATE_LOCAL_VARIABLE |
|----------------------------------|
| 240                              |
+----------------------------------+

In diesem Beispiel wird EXECUTE IMMEDIATE zur Ausführung einer SELECT-Anweisung verwendet, die Bindungsparameter enthält.

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;

Hinweis: Wenn Sie SnowSQL oder die klassische Weboberfläche verwenden, benutzen Sie stattdessen dieses Beispiel (siehe Verwenden von Snowflake Scripting in SnowSQL und über die klassische Weboberfläche):

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