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.

Dans ce chapitre :

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 est constitué de sections (dont certaines sont facultatives) qui sont délimitées par des mots-clés. Chaque section sert un objectif différent :

  • DECLARE : si vous devez utiliser des variables, des curseurs, etc. 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 Renvoyer 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

Notez que si vous utilisez SnowSQL ou l” Classic Console, vous devez utiliser des guillemets simples ou des doubles signes de dollar pour délimiter le bloc, comme expliqué dans Utilisation d’Exécution de scripts Snowflake dans SnowSQL et l”Classic Console :

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

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

L’exemple produit le résultat suivant :

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

Notez que si vous utilisez SnowSQL ou l”Classic Console, vous devez spécifier le bloc sous la forme d’une chaîne littérale (délimitée par des guillemets simples ou des doubles signes de dollar), et vous devez passer le bloc à la commande EXECUTE IMMEDIATE comme expliqué dans Utilisation d’Exécution de scripts Snowflake dans SnowSQL et l”Classic Console :

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

Notez que l’en-tête de colonne dans la sortie est un « bloc anonyme » ; 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
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy

Remarque : si vous utilisez SnowSQL ou l”Classic Console, utilisez cet exemple à la place (voir Utilisation d’Exécution de scripts Snowflake dans SnowSQL et l”Classic Console) :

EXECUTE IMMEDIATE $$
BEGIN
    CREATE TABLE parent (ID INTEGER);
    CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
    RETURN 'Completed';
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+
Copy