DECLARE (Exécution de scripts Snowflake)

Déclare un(e) ou plusieurs variables d’exécution des scripts Snowflake, curseurs, RESULTSETs, procédures stockées imbriquées ou exceptions.

Pour plus d’informations, consultez les rubriques suivantes :

Voir aussi:

LET

Syntaxe

DECLARE
  {   <variable_declaration>
    | <cursor_declaration>
    | <resultset_declaration>
    | <nested_stored_procedure_declaration>
    | <exception_declaration> };
  [
    {   <variable_declaration>
      | <cursor_declaration>
      | <resultset_declaration>
      | <nested_stored_procedure_declaration>
      | <exception_declaration> };
    ...
  ]
Copy

Les sections suivantes décrivent plus en détail la syntaxe de chaque type de déclaration :

Syntaxe de déclaration des variables

Utilisez la syntaxe suivante pour déclarer une variable.

<variable_declaration> ::=
  <variable_name> [<type>] [ { DEFAULT | := } <expression>]
Copy

Où :

variable_name

Nom de la variable. Le nom doit suivre les règles de dénomination pour Identificateurs d’objet.

type

Un type de données SQL.

DEFAULT expression ou . := expression

Affecte la valeur de l’expression expression à la variable. Si type et expression sont tous deux spécifiés, l’expression doit correspondre à un type de données qui correspond, ou peut être implicitement converti au type spécifié.

Par exemple :

profit NUMBER(38, 2) := 0;
Copy

Pour un exemple complet, voir Exemples.

Pour plus d’informations sur les variables, voir Utilisation des variables.

Syntaxe de déclaration des curseurs

Utilisez la syntaxe suivante pour déclarer un curseur.

<cursor_declaration> ::=
  <cursor_name> CURSOR FOR <query>
Copy

Où :

cursor_name

Le nom à donner au curseur. Il peut s’agir de tout identificateur Snowflake valide qui n’est pas déjà utilisé dans ce bloc. L’identificateur est utilisé par d’autres commandes liées au curseur, comme FETCH.

query

La requête qui définit le jeu de résultats sur lequel le curseur itère.

Il peut s’agir de presque n’importe quelle instruction SELECT valide. Pour spécifier des paramètres de liaison dans l’instruction SELECT, utilisez des points d’interrogation (?). Vous pouvez lier les paramètres pour lier des variables dans les clauses USING lorsque vous ouvrez le curseur.

Par exemple :

c1 CURSOR FOR SELECT id, price FROM invoices;
Copy

Pour plus d’informations sur les curseurs (y compris des exemples complets), voir Utilisation des curseurs.

Syntaxe de la déclaration RESULTSET

Utilisez la syntaxe suivante pour déclarer un RESULTSET :

<resultset_name> RESULTSET [ { DEFAULT | := } [ ASYNC ] ( <query> ) ] ;
Copy

Où :

resultset_name

Le nom à donner au RESULTSET.

Le nom doit être unique dans le scope actuel.

Le nom doit suivre les règles de dénomination pour Identificateurs d’objet.

ASYNC

Exécute la requête en tant que tâche enfant asynchrone.

La requête peut être n’importe quelle instruction SQL valide, y compris des instructions SELECT et DML telles que INSERT ou UPDATE.

Lorsque ce mot-clé est omis, la procédure stockée exécute les tâches enfants de manière séquentielle, et chaque tâche enfant attend que la tâche enfant en cours se termine avant de démarrer.

Vous pouvez utiliser ce mot-clé pour exécuter plusieurs tâches enfants simultanément, ce qui peut améliorer l’efficacité et réduire le temps d’exécution global.

Vous pouvez utiliser les instructions AWAIT et CANCEL pour gérer des tâches enfants asynchrones pour un RESULTSET.

DEFAULT query ou . := query

Assigne la valeur de query à RESULTSET.

Par exemple :

res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
Copy

Pour plus d’informations sur RESULTSETs (y compris des exemples complets), voir Utilisation des RESULTSETs.

Syntaxe de déclaration des procédures stockées imbriquées

Utilisez la syntaxe suivante pour déclarer une procédure stockée imbriquée :

<nested_procedure_name> PROCEDURE (
    [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  AS <nested_procedure_definition>
Copy

Où :

nested_procedure_name

Le nom de la procédure stockée imbriquée. Le nom doit suivre les règles de dénomination pour Identificateurs d’objet.

( [ arg_name arg_data_type ] [ , ... ] )

Spécifie les arguments d’entrée pour la procédure stockée imbriquée.

  • Pour arg_name, spécifiez le nom de l’argument d’entrée.

  • Pour arg_data_type, spécifiez un type de données SQL.

RETURNS { result_data_type | TABLE ( [ col_name col_data_type [ , ... ] ] ) }

Spécifie le type du résultat renvoyé par la procédure stockée. Actuellement, NOT NULL n’est pas pris en charge dans le paramètre RETURNS pour les procédures stockées imbriquées.

  • Pour RETURNS result_data_type, spécifiez un type de données SQL.

  • Pour RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ), si vous connaissez les types de données Snowflake des colonnes de la table renvoyée, spécifiez les noms et les types de colonnes :

    RETURNS TABLE (sales_date DATE, quantity NUMBER)
    
    Copy

    Sinon (par exemple, si vous déterminez les types de colonnes pendant l’exécution), vous pouvez omettre les noms et les types de colonnes :

    RETURNS TABLE ()
    
    Copy

    Note

    Actuellement, dans la clause RETURNS TABLE(...), vous ne pouvez pas spécifier GEOGRAPHY comme type de colonne. Ceci s’applique, que vous créiez une procédure stockée ou anonyme.

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE(g GEOGRAPHY)
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE(g GEOGRAPHY)
      ...
    CALL test_return_geography_table_1();
    
    Copy

    Si vous tentez de spécifier GEOGRAPHY comme type de colonne, l’appel de la procédure stockée entraîne une erreur :

    Stored procedure execution error: data type of returned table does not match expected returned table type
    
    Copy

    Pour contourner ce problème, vous pouvez omettre les arguments et les types de colonne dans RETURNS TABLE().

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE()
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE()
      ...
    CALL test_return_geography_table_1();
    
    Copy
AS nested_procedure_definition

Définit le code exécuté par la procédure stockée imbriquée. La définition peut consister en n’importe quel code valide.

Syntaxe de déclaration des exceptions

Utilisez la syntaxe suivante pour déclarer une exception :

<exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
Copy

Où :

exception_name

Le nom à donner à l’exception.

exception_number

Un numéro pour identifier de façon unique l’exception. Le nombre doit être un entier compris entre -20000 et -20999. Le numéro ne doit pas être utilisé pour une autre exception qui existe en même temps.

Par défaut : -20000

exception_message

Un message pour décrire l’exception. Le message ne doit pas contenir de caractères guillemets doubles.

Valeur par défaut : chaîne vide.

Par exemple :

exception_could_not_create_table EXCEPTION (-20003, 'ERROR: Could not create table.');
Copy

Pour plus d’informations sur les exceptions (y compris des exemples complets), voir Traitement des exceptions.

Exemples

Cet exemple déclare une variable nommée profit pour l’utiliser dans un bloc anonyme Snowflake Scripting :

DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
Copy

Remarque : Si vous utilisez Snowflake CLI, SnowSQL, Classic Console, ou la méthode execute_stream ou execute_string dans le code Connecteur Python, utilisez cet exemple à la place (voir Utilisation de Snowflake Scripting dans Snowflake CLI, SnowSQL, le Classic Console et le connecteur Python) :

EXECUTE IMMEDIATE 
$$
DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
$$
;
Copy

Pour plus d’exemples relatifs à la déclaration de variables, aux curseurs, aux RESULTSETs et aux exceptions, voir les chapitres suivants :