Comprendre les blocs dans Exécution de scripts Snowflake

Dans Exécution de scripts Snowflake, vous écrivez du code procédural dans un bloc Exécution de scripts Snowflake. Cette rubrique explique comment écrire du code procédural dans un bloc.

Comprendre la structure d’un bloc

Un bloc a la structure de base suivante :

DECLARE
  -- (variable declarations, cursor declarations, etc.) ...
BEGIN
  -- (Snowflake Scripting and SQL statements) ...
EXCEPTION
  -- (statements for handling exceptions) ...
END;
Copy

Un bloc se compose de sections obligatoires et facultatives délimitées par des mots-clés. Chaque section sert un objectif différent :

  • DECLARE : si vous devez utiliser des variables, des curseurs, des RESULTSETs ou des exceptions dans le bloc, vous pouvez les déclarer soit dans la section DECLARE du bloc, soit dans la section BEGIN … END du bloc.

    Vous pouvez déclarer les éléments suivants :

    Cette section du bloc est facultative.

  • BEGIN … END : écrivez les instructions SQL et les constructions Exécution de scripts Snowflake dans la section du bloc située entre BEGIN et END.

  • EXCEPTION : si vous devez ajouter un code de traitement des exceptions, ajoutez-le à la section EXCEPTION du bloc.

    Cette section du bloc est facultative.

Un bloc simple ne nécessite que les mots-clés BEGIN et END. Par exemple :

BEGIN
  CREATE TABLE employee (id INTEGER, ...);
  CREATE TABLE dependents (id INTEGER, ...);
END;
Copy

Important

Le mot-clé BEGIN qui démarre un bloc est différent du mot-clé BEGIN qui démarre une transaction. Pour éviter la confusion, Snowflake recommande fortement de commencer les transactions par BEGIN TRANSACTION (ou l’ancienne forme BEGIN WORK), plutôt que simplement BEGIN.

Tous les objets de base de données que vous créez dans un bloc (par exemple, les tables dans l’exemple ci-dessus) peuvent être utilisés en dehors du bloc.

Si le code utilise des variables, vous pouvez déclarer ces variables dans le bloc. Une façon de le faire se trouve dans la section DECLARE du bloc. Par exemple :

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

Cet exemple déclare une variable, utilise la variable et renvoie la valeur de la variable. Pour plus de détails sur la façon dont les valeurs sont renvoyées par un bloc, voir Renvoi d’une valeur.

Notez que ces variables ne peuvent pas être utilisées en dehors du bloc. Voir Comprendre la portée des déclarations.

Vous pouvez également déclarer une variable dans la section BEGIN … END du bloc en utilisant LET. Pour plus de détails, voir Déclaration d’une variable.

Utilisation d’un bloc dans une procédure stockée

Vous pouvez utiliser un bloc dans la définition d’une procédure stockée. Voici un exemple que vous pouvez exécuter dans Snowsight pour créer une procédure stockée contenant un bloc Exécution de scripts Snowflake :

CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
DECLARE
  radius FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius := 3;
  area_of_circle := PI() * radius * radius;
  RETURN area_of_circle;
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 OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
$$
DECLARE
  radius FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius := 3;
  area_of_circle := PI() * radius * radius;
  RETURN area_of_circle;
END;
$$
;
Copy

Vous pouvez appeler une procédure stockée en utilisant la commande CALL. L’exemple suivant appelle la procédure stockée area dans l’exemple précédent :

CALL area();
Copy

La procédure stockée renvoie la sortie suivante :

+--------------+
|         AREA |
|--------------|
| 28.274333882 |
+--------------+

Utilisation d’un bloc anonyme

Si vous ne voulez pas stocker le bloc dans une procédure stockée dans la base de données, vous pouvez définir et utiliser un bloc anonyme. Un bloc anonyme est un bloc qui ne fait pas partie d’une procédure stockée. Vous définissez le bloc comme une instruction SQL distincte et autonome.

L’instruction BEGIN qui définit le bloc exécute également le bloc. (Vous ne lancez pas une commande CALL distincte pour exécuter le bloc).

Voici un exemple de bloc anonyme que vous pouvez exécuter dans Snowsight :

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

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

L’exemple produit le résultat suivant :

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+

L’en-tête de colonne dans la sortie est anonymous block. Si le code avait été exécuté dans une procédure stockée, l’en-tête de colonne aurait été le nom de la procédure stockée.

L’exemple suivant définit un bloc anonyme qui crée deux tables qui sont liées. Dans cet exemple, le bloc de code procédural n’a pas besoin d’utiliser de variables, la section DECLARE du bloc est donc omise.

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
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 $$
BEGIN
    CREATE TABLE parent (ID INTEGER);
    CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
    RETURN 'Completed';
END;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+