使用预准备语句进行查询 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用预准备语句进行查询

您可以使用 Athena 参数化查询功能准备语句,以便使用不同的查询参数重复执行同一查询。预准备语句包含参数占位符,其值在执行时提供。预准备语句使 Athena 查询能够直接获取参数,并有助于防止 SQL 注入攻击。

注意事项和限制

  • 预准备语句是特定于工作组的,准备语句名称在工作组中必须是唯一的。

  • 仅在 Athena 引擎版本 2 中支持参数化查询。有关 Athena 引擎版本的信息,请参阅Athena 引擎版本控制.

  • 预准备语句的 IAM 权限是必需的。有关更多信息,请参阅允许访问预准备语句

  • 目前,参数化查询仅支持SELECTINSERT INTOCTAS, 和UNLOAD语句。

SQL 语句

您可以使用PREPAREEXECUTEDEALLOCATE PREPARESQL 语句在 Athena 控制台查询编辑器中运行参数化查询。

  • 要指定通常使用文字值的参数,请在PREPARE网页。

  • 若要在运行查询时将参数替换为值,请使用USING子句EXECUTE网页。

  • 要从工作组中的预准备语句列表中删除预准备语句,请使用DEALLOCATE PREPARE网页。

以下各节提供了有关这些语句的附加信息。

PREPARE

准备要在以后运行的语句。预准备语句以您指定的名称保存在当前工作组中。语句可以包含参数来代替要在查询运行时替换的文字。要替换为值的参数用问号表示。

Syntax

PREPARE statement_name FROM statement

下表对这些参数进行了说明。

参数 描述
语句名称 要准备的语句的名称。在工作组内,此名称必须是唯一的。
statement ASELECTCTAS,或者INSERT INTO查询。

准备示例

以下示例演示使用PREPARE网页。问号表示由EXECUTE语句运行查询时。

PREPARE my_select1 FROM SELECT * FROM nation
PREPARE my_select2 FROM SELECT * FROM "my_database"."my_table" WHERE year = ?
PREPARE my_select3 FROM SELECT order FROM orders WHERE productid = ? and quantity < ?
PREPARE my_insert FROM INSERT INTO cities_usa (city, state) SELECT city, state FROM cities_world WHERE country = ?
PREPARE my_unload FROM UNLOAD (SELECT * FROM table1 WHERE productid < ?) TO 's3://my_output_bucket/' WITH (format='PARQUET')

EXECUTE

运行预编译语句。参数的值在USING子句。

Syntax

EXECUTE statement_name [USING value1 [ ,value2, ... ] ]

语句名称是预编译语句的名称。Value1Value2是要为语句中的参数指定的值。

执行示例

以下示例运行my_select1预准备语句,该语句不包含任何参数。

EXECUTE my_select1

以下示例运行my_select2预准备语句,其中包含一个参数。

EXECUTE my_select2 USING 2012

以下示例运行my_select3准备语句,它使用两个参数。

EXECUTE my_select3 USING 346078, 12

以下示例为预准备语句中的参数提供字符串值my_insert.

EXECUTE my_insert USING 'usa'

下面的示例为productid预准备语句中的参数my_unload.

EXECUTE my_unload USING 12

取消分配准备

从当前工作组中的预准备语句列表中删除具有指定名称的预准备语句。

Syntax

DEALLOCATE PREPARE statement_name

语句名称是要删除的预编译语句的名称。

Example

以下示例删除my_select1准备好的语句来自当前工作组。

DEALLOCATE PREPARE my_select1