EXECUTE IMMEDIATE

Exécute une chaîne qui contient une instruction SQL ou une instruction Exécution de scripts Snowflake.

Syntaxe

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

Paramètres requis

'string_literal' ou . variable ou . session_variable

Un littéral de chaîne, une variable Exécution de scripts Snowflake ou une variable de session qui contient une instruction. Une instruction peut être l’un des éléments suivants :

  • Une seule instruction SQL

  • Un appel de procédure stockée

  • Une instruction de flux de contrôle (par exemple, une instruction looping ou branching)

  • Un bloc

Si vous utilisez une variable de session, la longueur de l’instruction ne doit pas dépasser la taille maximale d’une variable de session (256 octets).

Paramètres facultatifs

USING ( bind_variable [ , bind_variable ... ] )

Spécifie une ou plusieurs variables de liaison qui contiennent des valeurs à utiliser dans la définition de la requête du curseur (par exemple, dans une clause WHERE).

Renvoie

EXECUTE IMMEDIATE renvoie le résultat de l’instruction exécutée. Par exemple, si la chaîne ou la variable contient une instruction SELECT, le jeu de résultats de SELECT est renvoyé.

Notes sur l’utilisation

  • Le string_literal, la variable ou la session_variable ne doivent contenir qu’une seule instruction. (Un bloc est considéré comme une seule instruction, même si le corps du bloc en contient plusieurs).

  • Une session_variable doit être précédée d’un signe dollar ($).

  • Une variable locale doit ne pas être précédée d’un signe dollar ($).

Exemples

Les exemples suivants utilisent la commande EXECUTE IMMEDIATE.

Exécution d’un littéral de chaîne

Cet exemple exécute une instruction définie dans un littéral de chaîne :

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

Exécution d’une instruction dans une variable de session

Cet exemple exécute une instruction définie dans une variable de session :

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

Exécution d’instructions avec des variables

Cet exemple exécute des instructions qui sont définies dans deux variables locales dans une procédure stockée Exécution de scripts Snowflake. Cet exemple démontre également que EXECUTE IMMEDIATE fonctionne non seulement avec un littéral de chaîne, mais aussi avec une expression qui est évaluée sur une chaîne (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

Remarque : si vous utilisez SnowSQL, Classic Console, ou la méthode execute_stream ou execute_string dans le code Python Connector, utilisez cet exemple à la place (voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL, Classic Console, et le connecteur Python) :

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

Exécution d’un bloc anonyme sur SnowSQL ou la console classique

Lorsque vous exécutez un bloc anonyme Exécution de scripts Snowflake dans SnowSQL ou Classic Console, vous devez spécifier le bloc sous forme de littéral de chaîne (délimité par des guillemets simples ou des signes de dollar doubles), et vous devez transmettre le bloc à la commande EXECUTEIMMEDIATE. Pour plus d’informations, voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL, Classic Console, et le connecteur Python.

Cet exemple exécute un bloc anonyme transmis à la commande EXECUTE IMMEDIATE :

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

Exécution d’une instruction avec des variables de liaison

Cet exemple utilise EXECUTE IMMEDIATE pour exécuter une instruction SELECT qui contient des variables de liaison dans le paramètre USING d’un bloc Exécution de scripts Snowflake. Commencez par créer la table et par insérer les données :

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

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

Maintenant, exécutez le bloc :

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

Remarque : si vous utilisez SnowSQL, Classic Console, ou la méthode execute_stream ou execute_string dans le code Python Connector, utilisez cet exemple à la place (voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL, Classic Console, et le connecteur Python) :

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