

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# PREPARE
<a name="r_PREPARE"></a>

准备语句以便执行。

PREPARE 会创建一个预编译语句。在运行 PREPARE 语句时，会对指定的语句（SELECT、INSERT、UPDATE 或 DELETE）进行解析、重写和计划。为预编译语句发出 EXECUTE 命令时，Amazon Redshift 可能会选择修改查询执行计划（以便根据指定的参数值来提高性能），然后再执行预编译语句。

## 语法
<a name="r_PREPARE-synopsis"></a>

```
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
```

## 参数
<a name="r_PREPARE-parameters"></a>

 *plan\$1name*   
为此特定预编译语句指定的任意名称。它在单个会话中必须是唯一的，随后用于执行或取消分配先前预编译的语句。

 *datatype*   
预编译语句的参数的数据类型。要在已准备的语句自身中引用参数，请使用 \$11、\$12 等，最多可达 \$132767。

 *statement *   
任意 SELECT、INSERT、UPDATE 或 DELETE 语句。

## 使用说明
<a name="r_PREPARE_usage_notes"></a>

预编译语句可以接受参数和值，它们在执行语句时将会被取代。要在预编译语句中包含参数，请在 PREPARE 语句中提供数据类型的列表；并在要预编译的语句自身中，通过使用 \$11, \$12, ... 表示法来按位置引用参数。参数的最大数量为 32767。执行该语句时，会在 EXECUTE 语句中为这些参数指定实际值。有关更多信息，请参阅 [EXECUTE](r_EXECUTE.md)。

预编译语句只在当前会话的持续时间内有效。当会话结束时，预编译语句将被丢弃，因此必须重新创建该语句才能再次使用。这也意味着一个预编译语句不能同时由多个数据库客户端使用；不过，每个客户端可以创建自己的预编译语句加以使用。可以使用 DEALLOCATE 命令手动删除预编译语句。

当一个会话用于执行大量类似的语句时，预编译语句能够发挥最大的性能优势。正如上文所述，对于预编译语句的每次新执行，Amazon Redshift 可能会根据指定的参数值，再次修改查询执行计划来提高性能。要检查 Amazon Redshift 为任何特定 EXECUTE 语句选择的查询执行计划，请使用 [EXPLAIN](r_EXPLAIN.md) 命令。

有关查询计划的更多信息以及 Amazon Redshift 为查询优化收集的统计数据，请参阅 [ANALYZE](r_ANALYZE.md) 命令。

## 示例
<a name="sub-examples-prepare"></a>

创建一个临时表，准备 INSERT 语句并执行该语句：

```
DROP TABLE IF EXISTS prep1;
CREATE TABLE prep1 (c1 int, c2 char(20));
PREPARE prep_insert_plan (int, char)
AS insert into prep1 values ($1, $2);
EXECUTE prep_insert_plan (1, 'one');
EXECUTE prep_insert_plan (2, 'two');
EXECUTE prep_insert_plan (3, 'three');
DEALLOCATE prep_insert_plan;
```

准备 SELECT 语句并执行该语句：

```
PREPARE prep_select_plan (int)
AS select * from prep1 where c1 = $1;
EXECUTE prep_select_plan (2);
EXECUTE prep_select_plan (3);
DEALLOCATE prep_select_plan;
```

## 另请参阅
<a name="r_PREPARE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [EXECUTE](r_EXECUTE.md) 