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';
Copy

可以在同一语句中初始化多个变量,从而减少与服务器的往返通信次数。

SET (VAR1, VAR2, VAR3)=(10, 20, 30);
SET (VAR1, VAR2, VAR3)=(SELECT 10, 20, 30);
Copy

在连接时设置变量

除了使用 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);
Copy

在 SQL 中使用变量

可以在 Snowflake 中任何允许使用字面量常量的地方使用变量,文档中注明者除外。若要将它们从绑定值和列名中区分开来,所有变量都必须以 $ 符号为前缀。

例如:

SET (MIN, MAX)=(40, 70);

SELECT $MIN;

SELECT AVG(SALARY) FROM EMP WHERE AGE BETWEEN $MIN AND $MAX;
Copy

备注

由于 $ 符号是用于标识 SQL 语句中变量的前缀,因此在标识符中使用时将其视为特殊字符。标识符(数据库名称、表名称、列名称等)不能以特殊字符开头,除非整个名称用双引号括起来。有关更多信息,请参阅 对象标识符

变量还可以包含标识符名称,例如表名称。若要使用变量作为标识符,您必须将其封装在 IDENTIFIER() 中,例如 IDENTIFIER($MY_VARIABLE)。以下是一些示例:

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
DROP TABLE IDENTIFIER($MY_TABLE_NAME);
Copy

在 FROM 子句的上下文中,可以将变量名称封装在 TABLE() 中,如下所示:

SELECT * FROM TABLE($MY_TABLE_NAME);
+----+
|  I |
|----|
| 42 |
+----+
Copy

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

会话变量函数

为操作会话变量提供以下方便使用的函数,以支持与其他数据库系统的兼容性,并通过不支持 $ 语法的工具发出 SQL,以便访问变量。请注意,所有这些函数都接受并返回字符串形式的会话变量值:

  • SYS_CONTEXT 和 SET_SYS_CONTEXT

  • SESSION_CONTEXT 和 SET_SESSION_CONTEXT

  • GETVARIABLE 和 SETVARIABLE

以下是使用 GETVARIABLE 的示例。首先,使用 SET 命令定义变量:

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

返回变量值:

SELECT GETVARIABLE('var_artist_name');
Copy

在此示例中,输出是 NULL,因为 Snowflake 存储的变量都是大写字母。

更新大小写:

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

您可以在 WHERE 子句中使用变量名称,例如:

SELECT album_title
  FROM albums
  WHERE artist = $VAR_ARTIST_NAME;
Copy

删除/移除变量

SQL 变量是会话专用的。关闭 Snowflake 会话时,将删除会话期间创建的所有变量。这意味着任何人都无法访问已在其他会话中设置的用户定义变量,并且当会话关闭时,这些变量会过期。

此外,始终可以使用 UNSET 命令显式销毁变量。

例如:

UNSET MY_VARIABLE;
Copy
语言: 中文