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)
。以下是一些示例:
CREATE TABLE IDENTIFIER($MY_TABLE_NAME) (i INTEGER); INSERT INTO IDENTIFIER($MY_TABLE_NAME) (i) VALUES (42);SELECT * FROM IDENTIFIER($MY_TABLE_NAME);DROP TABLE IDENTIFIER($MY_TABLE_NAME);
在 FROM 子句的上下文中,可以将变量名称封装在 TABLE()
中,如下所示:
SELECT * FROM TABLE($MY_TABLE_NAME); +----+ | I | |----| | 42 | +----+
有关 IDENTIFIER() 的更多信息,请参阅 将字面量和变量用作标识符。
查看会话的变量¶
若要查看当前会话中定义的所有变量,请使用 SHOW VARIABLES 命令:
SET (MIN, MAX)=(40, 70); +----------------------------------+ | status | |----------------------------------| | Statement executed successfully. | +----------------------------------+ SHOW VARIABLES; +-------------+---------------------------------+---------------------------------+------+-------+-------+---------+ | session_id | created_on | updated_on | name | value | type | comment | |-------------+---------------------------------+---------------------------------+------+-------+-------+---------| | 34359992326 | Fri, 21 Apr 2017 11:20:32 -0700 | Fri, 21 Apr 2017 11:20:32 -0700 | MAX | 70 | fixed | | | 34359992326 | Fri, 21 Apr 2017 11:20:32 -0700 | Fri, 21 Apr 2017 11:20:32 -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;