Variables SQL

Vous pouvez définir et utiliser des variables SQL dans les sessions dans Snowflake.

Vue d’ensemble

Snowflake prend en charge les variables SQL déclarées par l’utilisateur. Elles ont de nombreuses utilisations, telles que le stockage de paramètres d’environnement spécifiques à l’application.

Identificateurs de variables

Les variables SQL sont identifiées globalement à l’aide de noms insensibles à la casse.

DDL de variables

Snowflake fournit les commandes DDL suivantes pour l’utilisation des variables SQL :

Initialisation des variables

Vous pouvez définir des variables en exécutant l’instruction SQL SET ou en définissant les variables dans la chaîne de connexion lorsque vous vous connectez à Snowflake.

La taille des chaînes ou des variables binaires est limitée à 256 octets.

Utilisation de SQL pour initialiser des variables dans une session

You can initialize variables in SQL using the SET command. The data type of the variable is derived from the data type of the result of the evaluated expression. The following examples initialize variables:

SET my_variable1 = 10;
SET my_variable2 = 'example';
Copy

Vous pouvez initialiser des variables à l’aide de requêtes qui renvoient un seul résultat. Les exemples suivants initialisent des variables à l’aide de requêtes :

SET cust_last_name = (SELECT lname FROM customers WHERE customer_id=100);
SET timestamp_variable = (SELECT CURRENT_TIMESTAMP());
Copy

You can initialize multiple variables in the same statement, thereby reducing the number of round-trip communications with the server. The following examples initialize multiple variables:

SET (var1, var2, var3) = (10, 20, 30);
SET (current_user, current_warehouse) = ((SELECT CURRENT_USER()), (SELECT CURRENT_WAREHOUSE()));
Copy

Définition des variables à la connexion

En plus d’utiliser SET pour définir des variables dans une session, vous pouvez transmettre des variables en arguments dans la chaîne de connexion utilisée pour initialiser une session dans Snowflake. Cette option est particulièrement utile lorsque vous utilisez des outils où la spécification de la chaîne de connexion est la seule personnalisation possible.

For example, using the Snowflake JDBC driver, you can set additional connection properties that are interpreted as parameters. The JDBC API requires SQL variables to be strings.

// Build connection properties
Properties properties = new Properties();

// Required connection properties
properties.put("user"    ,  "jsmith"      );
properties.put("password",  "mypassword");
properties.put("account" ,  "myaccount");

// Set some additional variables.
properties.put("$variable_1", "some example");
properties.put("$variable_2", "1"           );

// Create a new connection
String connectStr = "jdbc:snowflake://localhost:8080";

// Open a connection under the snowflake account and enable variable support
Connection con = DriverManager.getConnection(connectStr, properties);
Copy

Utilisation des variables dans SQL

Des variables peuvent être utilisées dans Snowflake partout où une constante littérale est permise, sauf dans les cas indiqués dans la documentation. Pour les distinguer des valeurs de liaison et des noms de colonnes, toutes les variables doivent être préfixées par un signe $.

Par exemple :

SET (min, max)=(40, 70);

SELECT $min;

SELECT AVG(salary) FROM emp WHERE age BETWEEN $min AND $max;
Copy

Note

Because the $ sign is the prefix used to identify variables in SQL statements, it is treated as a special character when used in identifiers. Identifiers (database names, table names, column names, and so on) can’t start with special characters unless the entire name is enclosed in double quotes. For more information, see Identificateurs d’objet.

Variables can also contain identifier names, such as table names. To use a variable as an identifier, you must wrap it inside IDENTIFIER() (for example, IDENTIFIER($my_variable)). Some examples are below:

SET my_table_name='table1';
Copy
CREATE TABLE IDENTIFIER($my_table_name) (i INTEGER);
INSERT INTO IDENTIFIER($my_table_name) (i) VALUES (42);
Copy
SELECT * FROM IDENTIFIER($my_table_name);
Copy
+----+
|  I |
|----|
| 42 |
+----+

Dans le contexte d’une clause FROM, vous pouvez envelopper le nom de la variable dans TABLE(), comme indiqué ci-dessous :

SELECT * FROM TABLE($my_table_name);
Copy
+----+
|  I |
|----|
| 42 |
+----+
DROP TABLE IDENTIFIER($my_table_name);
Copy

Pour plus d’informations sur IDENTIFIER(), voir Littéraux et variables comme identificateurs avec la syntaxe IDENTIFIER().

Voir des variables de la session

Pour voir toutes les variables définies dans la session actuelle, utilisez la commande SHOW VARIABLES :

SET (min, max)=(40, 70);
Copy
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SHOW VARIABLES;
Copy
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+
|     session_id | created_on                    | updated_on                    | name | value | type  | comment |
|----------------+-------------------------------+-------------------------------+------+-------+-------+---------|
| 10363773891062 | 2024-06-28 10:09:57.990 -0700 | 2024-06-28 10:09:58.032 -0700 | MAX  | 70    | fixed |         |
| 10363773891062 | 2024-06-28 10:09:57.990 -0700 | 2024-06-28 10:09:58.021 -0700 | MIN  | 40    | fixed |         |
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+

Fonctions des variables de session

The following convenience functions are provided for manipulating session variables to support compatibility with other database systems and to issue SQL through tools that do not support the $ syntax for accessing variables. All of these functions accept and return session variable values as strings:

  • SYS_CONTEXT et SET_SYS_CONTEXT

  • SESSION_CONTEXT et SET_SESSION_CONTEXT

  • GETVARIABLE et SETVARIABLE

Voici des exemples d’utilisation de GETVARIABLE. Définissez d’abord une variable en utilisant SET :

SET var_artist_name = 'Jackson Browne';
Copy
+----------------------------------+
| status                           |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+

Renvoyez la valeur de la variable :

SELECT GETVARIABLE('var_artist_name');
Copy

Dans cet exemple, la sortie est NULL car Snowflake stocke les variables avec des lettres majuscules.

Mise à jour de la casse :

SELECT GETVARIABLE('VAR_ARTIST_NAME');
Copy
+--------------------------------+
| GETVARIABLE('VAR_ARTIST_NAME') |
+--------------------------------+
| Jackson Browne                 |
+--------------------------------+

Vous pouvez utiliser le nom de la variable dans une clause WHERE, par exemple :

SELECT album_title
  FROM albums
  WHERE artist = $var_artist_name;
Copy

Suppression des variables

Les variables SQL sont privées dans une session. Lorsqu’une session Snowflake est fermée, toutes les variables créées pendant la session sont détruites. Cela signifie que personne ne peut accéder aux variables définies par l’utilisateur qui ont été définies dans une autre session, et lorsque la session est fermée, ces variables expirent.

In addition, variables can be explicitly dropped using the UNSET command.

Par exemple :

UNSET my_variable;
Copy