SQL 变量¶
您可以在 Snowflake 的会话中定义和使用 SQL 变量。
本主题内容:
概述¶
Snowflake 支持用户声明的 SQL 变量。它们具有许多用途,例如存储应用程序特定的环境设置。
变量标识符¶
SQL 变量使用不区分大小写的名称进行全局标识。
变量 DDL¶
Snowflake 提供了以下使用 SQL 变量的 DDL 命令:
初始化变量¶
您可以通过执行 SQL 语句 SET 或在连接到 Snowflake 时在连接字符串中设置变量的方式来设置变量。
字符串或二进制变量的大小限制为 256 字节。
使用 SQL 初始化会话中的变量¶
可以使用 SET 命令在 SQL 中初始化变量。变量的数据类型派生自计算表达式结果的数据类型。
SET my_variable=10;
SET my_variable='example';
可以在同一语句中初始化多个变量,从而减少与服务器的往返通信次数。
SET (var1, var2, var3)=(10, 20, 30);
SET (var1, var2, var3)=(SELECT 10, 20, 30);
在连接时设置变量¶
除了使用 SET 在会话中设置变量之外,在 Snowflake 中用于初始化会话的连接字符串中,您还可以将变量作为实参传递。如果连接字符串的规范是唯一可能的自定义工具,则此选项特别有用。
例如,使用 Snowflake JDBC 驱动程序,您可以对将解释为参数的其他连接属性进行设置。请注意,JDBC API 要求 SQL 变量是字符串。
// 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);
在 SQL 中使用变量¶
可以在 Snowflake 中任何允许使用字面量常量的地方使用变量,文档中注明者除外。若要将它们从绑定值和列名中区分开来,所有变量都必须以 $
符号为前缀。
例如:
SET (min, max)=(40, 70);
SELECT $min;
SELECT AVG(salary) FROM emp WHERE age BETWEEN $min AND $max;
备注
由于 $
符号是用于标识 SQL 语句中变量的前缀,因此在标识符中使用时将其视为特殊字符。标识符(数据库名称、表名称、列名称等)不能以特殊字符开头,除非整个名称用双引号括起来。有关更多信息,请参阅 对象标识符。
变量还可以包含标识符名称,例如表名称。若要使用变量作为标识符,您必须将其封装在 IDENTIFIER()
中,例如 IDENTIFIER($my_variable)
。以下是一些示例:
SET my_table_name='table1';
CREATE TABLE IDENTIFIER($my_table_name) (i INTEGER);
INSERT INTO IDENTIFIER($my_table_name) (i) VALUES (42);
SELECT * FROM IDENTIFIER($my_table_name);
+----+
| I |
|----|
| 42 |
+----+
在 FROM 子句的上下文中,可以将变量名称封装在 TABLE()
中,如下所示:
SELECT * FROM TABLE($my_table_name);
+----+
| I |
|----|
| 42 |
+----+
DROP TABLE IDENTIFIER($my_table_name);
有关 IDENTIFIER()
的更多信息,请参阅 将字面量和变量用作标识符。
查看会话的变量¶
若要查看当前会话中定义的所有变量,请使用 SHOW VARIABLES 命令:
SET (min, max)=(40, 70);
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SHOW VARIABLES;
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+
| 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 | |
+----------------+-------------------------------+-------------------------------+------+-------+-------+---------+
会话变量函数¶
为操作会话变量提供以下方便使用的函数,以支持与其他数据库系统的兼容性,并通过不支持 $
语法的工具发出 SQL,以便访问变量。请注意,所有这些函数都接受并返回字符串形式的会话变量值:
SYS_CONTEXT 和 SET_SYS_CONTEXT 中的限制
SESSION_CONTEXT 和 SET_SESSION_CONTEXT 中的限制
GETVARIABLE 和 SETVARIABLE 中的限制
以下是使用 GETVARIABLE 的示例。首先,使用 SET 命令定义变量:
SET var_artist_name = 'Jackson Browne';
+----------------------------------+
| status |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
返回变量值:
SELECT GETVARIABLE('var_artist_name');
在此示例中,输出是 NULL,因为 Snowflake 存储的变量都是大写字母。
更新大小写:
SELECT GETVARIABLE('VAR_ARTIST_NAME');
+--------------------------------+
| GETVARIABLE('VAR_ARTIST_NAME') |
+--------------------------------+
| Jackson Browne |
+--------------------------------+
您可以在 WHERE 子句中使用变量名称,例如:
SELECT album_title
FROM albums
WHERE artist = $var_artist_name;
移除变量¶
SQL 变量是会话专用的。关闭 Snowflake 会话时,将删除会话期间创建的所有变量。这意味着任何人都无法访问已在其他会话中设置的用户定义变量,并且当会话关闭时,这些变量会过期。
此外,始终可以使用 UNSET 命令显式销毁变量。
例如:
UNSET my_variable;