绑定变量

应用程序可以接受来自用户的数据,并在 SQL 语句中使用该数据。例如,应用程序可能会要求用户输入联系信息,例如地址和电话号码。

要在 SQL 语句中指定此用户输入,您可以以编程方式构造一个字符串来表示该 SQL 语句,方法是将用户输入与其他语句部分拼接起来。或者,您可以使用 绑定变量。要绑定变量,请在 SQL 语句文本中放置一个或多个占位符,然后为每个占位符指定变量(要使用的值)。绑定变量可以在构造带有用户输入的 SQL 语句时防止 SQL 注入攻击。

您可以通过以下方式在 Snowflake 中使用绑定变量:

概述

使用绑定变量,您可以将 SQL 语句中的字面量替换为占位符。例如,以下 SQL 语句对插入的值使用字面量:

INSERT INTO t (c1, c2) VALUES (1, 'Test string');
Copy

以下 SQL 语句对插入的值使用占位符:

INSERT INTO t (c1, c2) VALUES (?, ?);
Copy

您的应用程序代码将数据与 SQL 语句中的每个占位符绑定在一起。使用占位符绑定数据的技术取决于编程语言。占位符的语法也因编程语言而异。它是 ?, :<varname>,或是 %<varname>

将绑定变量与驱动程序一起使用

使用 Snowflake 驱动程序,您可以编写在 Snowflake 上执行操作的应用程序。驱动程序支持 Go、Java 和 Python 等编程语言。有关在应用程序中为特定驱动程序使用绑定变量的信息,请按照驱动程序的链接进行操作:

备注

PHP 驱动程序不支持绑定变量。

在 Snowflake Scripting 中使用绑定变量

您可以使用 Snowflake Scripting 来创建执行 SQL 的过程代码,例如代码块和存储过程。请在变量名称前面加上冒号。例如,以下 INSERT 语句指定名为 variable1 的绑定变量:

INSERT INTO t (c1) VALUES (:variable1)
Copy

有关在 Snowflake Scripting 中使用绑定变量的信息,请参阅 在 SQL 语句中使用变量(绑定)

将绑定变量与 SQL API 结合使用

您可以使用 Snowflake SQL REST API 访问和更新 Snowflake 数据库中的数据。您可以创建使用 SQL API 的应用程序,以提交 SQL 语句并管理部署。

当您提交执行 SQL 语句的请求时,您可以对语句中的值使用绑定变量。有关更多信息,请参阅 在语句中使用绑定变量

将值数组绑定到变量

您可以将值数组绑定到 SQL 语句中的变量。使用此技术,您可以通过在单个批处理中插入多行来提高性能,从而避免网络往返和编译。数组绑定的使用也称为“批量插入”。

备注

Snowflake 支持建议使用的其他数据加载方法,而不是使用数组绑定。有关更多信息,请参阅 将数据载入 Snowflake数据加载和卸载命令

以下是 Python 代码中的数组绑定示例:

conn = snowflake.connector.connect( ... )
rows_to_insert = [('milk', 2), ('apple', 3), ('egg', 2)]
conn.cursor().executemany(
             "insert into grocery (item, quantity) values (?, ?)",
             rows_to_insert)
Copy

此示例指定以下绑定列表:[('milk', 2), ('apple', 3), ('egg', 2)]。应用程序指定绑定列表的方式取决于编程语言。

此代码在表中插入三行:

+-------+----+
| C1    | C2 |
|-------+----|
| milk  |  2 |
| apple |  3 |
| egg   |  2 |
+-------+----+

有关在应用程序中为特定驱动程序使用数组绑定的信息,请按照驱动程序的链接进行操作:

备注

PHP 驱动程序不支持数组绑定。

数组绑定的限制

以下限制适用于数组绑定:

  • 仅 INSERT INTO ...VALUES 语句可以包含数组绑定变量。

  • VALUES 子句必须是绑定变量的单行列表。例如,不允许出现以下 VALUES 子句:

    VALUES (?,?), (?,?)
    
    Copy

在不使用数组绑定的情况下插入多行

INSERT 语句可能会使用绑定变量插入多行,而不使用数组绑定。以下示例将值插入到两行中,但它不使用数组绑定。

INSERT INTO t VALUES (?,?), (?,?);
Copy

应用程序可以按顺序为占位符指定一个绑定列表,该列表相当于以下值:[1,'String1',2,'String2']。因为 VALUES 子句指定多行时,语句仅插入确切的值数(在示例中为 4 个),而不是动态数量的行。

将绑定变量与半结构化数据结合使用

要将绑定变量与半结构化数据结合使用,请将变量绑定为字符串类型,并使用 PARSE_JSONARRAY_CONSTRUCT 等函数。

以下示例创建包含一个 VARIANT 列的表,然后调用 PARSE_JSON 函数将半结构化数据插入到带有绑定变量的表中:

CREATE TABLE t (a VARIANT);
-- Code that supplies a bind value for ? of '{'a': 'abc', 'x': 'xyz'}'
INSERT INTO t SELECT PARSE_JSON(a) FROM VALUES (?);
Copy

以下示例查询该表:

SELECT * FROM t;
Copy

该查询会返回以下输出:

+---------------+
| A             |
|---------------|
| {             |
|   "a": "abc", |
|   "x": "xyz"  |
| }             |
+---------------+

以下语句调用 ARRAY_CONSTRUCT 函数将半结构化数据数组插入到带有绑定变量的 VARIANT 列中:

INSERT INTO t SELECT ARRAY_CONSTRUCT(column1) FROM VALUES (?);
Copy

这两个示例都可以插入单行,也可以使用数组绑定在一个批处理中插入多行。您可以使用此技术插入 VARIANT 列中有效的任何类型的半结构化数据。

语言: 中文