如果相同或者类似的查询要不断重复执行,那么只执行一次查询规划 应该是更好些.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.