SPI_prepare
函数名
SPI_prepare -- 为一个命令准备一个规划但不立即执行它
原型
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_ERROR_ARGUMENT
注意
使用参数有一个缺点:因为规划器不知道将提供给参数的数值,所以,相比普通的带着所有可见常量的命令而言,它可能会做出一个较差的规划选择。