SPI_prepare

Name

SPI_prepare --  为一个查询准备规划,但还不执行它.

Synopsis

SPI_prepare(query, nargs, argtypes)

输入

query

查询字符串

nargs

输入的参数个数($1 ... $nargs -象 SQL-函数里一样)

argtypes

指向用于输入参数的类型的,类型为 OID 数组的指针

输出

void *

指向一个执行规划的指针(分析器+规划器+优化器)

描述

SPI_prepare 创建和返回一个执行规划(分析器+规划器+优化器)但是不执行查询. 应该只从一个已联接的过程部调用.

用法

如果相同或者类似的查询要不断重复执行,那么只执行一次查询规划 应该是更好些.SPI_prepare 把一个查询字串 转换成一个执行计划,你可以把它不断传递给 SPI_execp

我们可以把准备好的查询通用化,方法是在那些普通查询里是常量的地方 书写参数($1,$2,等等).参数的数值随后在调用 SPI_execp 的时候声明.这样就允许已准备的查询在远比没有参数时广泛得多的条件下使用.

注意: 不过,这种方法有个缺点∶因为规划器并不知道将提供为参数的 数值,所以它可能会选择比看得见所有常量的简单查询时更差的查询规划.

如果查询使用了参数,它们的数量和数据类型必需在调用 SPI_prepare 的时候声明.

SPI_prepare 返回的规划可能只能被用于目前的过程, 因为 SPI_finish 将释放为规划分配的存储器.参考 SPI_saveplan.

如果成功,将返回一个非空的指针.否则,你会得到一个 NULL(空)的规划. 不管那种情况 SPI_result 都将象SPI_exec 返回的值那样被设置, 除非它被设置为 SPI_ERROR_ARGUMENT --因为查询是 NULL 或 nargs < 0 或nargs > 0 && argtypes 是 NULL.