Name
SPI_prepare -- 为一个命令准备一个规划,但还不执行它
Synopsis
void * SPI_prepare(const char * command, int nargs, Oid * argtypes)
描述
SPI_prepare 为声明的命令创建和返回一个执行规划但是不执行查询。
应该只从一个已联接的过程部调用。
如果相同或者类似的查询要多次重复执行,那么只进行一次查询规划应该是更好些。
SPI_prepare 把一个命令字串转换成一个执行计划,你可以用 SPI_execute_plan 多次执行它。
我们可以把准备好的查询通用化,方法是在那些普通查询里是常量的地方书写参数($1,$2,等等)。
参数的数值随后在调用 SPI_execute_plan 的时候声明。
这样就允许已准备的查询在远比没有参数时广泛得多的场合下使用。
SPI_prepare 返回的规划只能在当前过程调用中使用,
因为 SPI_finish 释放为一个规划分配的内存。
不过,一个规划可以用函数 SPI_saveplan 函数保存更长的时间。
参数
- const char * command
命令字串
- int nargs
输入参数的个数(($1,$2,等等。)
- Oid * argtypes
一个指针,指向包含参数数据类型的 OID 的数组
返回值
SPI_prepare 返回一个指向一个执行规划的非空指针。
错误时将返回 NULL 并且
SPI_result 将设置为和 SPI_execute 同样错误的返回值,
例外是在 command 是 NULL 的时候,
或者是 nargs 小于 0 或者 nargs 大于 0 并且 argtypes 是 NULL 的时候,
SPI_result 会被设置成 SPI_ERROR_ARGUMENT。
注意
使用参数有一个缺点:因为规划器不知道将提供给参数的数值,
所以,相比普通的带着所有可见常量的命令而言,它可能会做出一个较差的规划选择。