SPI_prepare

Name

SPI_prepare -- 为一个命令准备一个规划,但还不执行它

Synopsis

void * SPI_prepare(const char * command, int nargs, Oid * argtypes)

描述

SPI_prepare 为声明的命令创建和返回一个执行规划但是不执行查询。 应该只从一个已联接的过程部调用。

如果相同或者类似的查询要多次重复执行,那么只进行一次查询规划应该是更好些。 SPI_prepare 把一个命令字串转换成一个执行计划,你可以用 SPI_execp 多次执行它。

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

SPI_prepare 返回的规划只能在当前过程调用中使用, 因为 SPI_finish 释放为一个规划分配的内存。 不过,一个规划可以用函数 SPI_saveplan 函数保存更长的时间。

参数

const char * command

命令字串

int nargs

输入参数的个数(($1$2,等等。)

Oid * argtypes

一个指针,指向包含参数数据类型的 OID 的数组

返回值

SPI_prepare 返回一个指向一个执行规划的非空指针。 错误时将返回 NULL。不管成功还是错误,SPI_result 都将模拟 SPI_exec 的返回值进行设置, 例外是在 commandNULL 的时候, 或者是 nargs 小于 0 或者 nargs 大于 0 并且 argtypesNULL 的时候, SPI_result 会被设置成 SPI_ERROR_ARGUMENT

注意

使用参数有一个缺点:因为规划器不知道将提供给参数的数值, 所以,相比普通的带着所有可见常量的命令而言,它可能会做出一个较差的规划选择。