SPI_execute_extended — 使用外部参数执行命令
int SPI_execute_extended(const char *command, const SPIExecuteOptions *options)
SPI_execute_extended 执行一个可能包含对外部提供参数引用的命令。命令文本使用 $ 来引用参数,而 noptions->params 对象(如果已提供)则提供每个此类符号的值和类型信息。各种执行选项也可以在 options 结构中指定。
options->params 对象通常应该用 PARAM_FLAG_CONST 标志标记每个参数,因为查询总是使用一次性计划。
如果 options->dest 不为 NULL,那么结果行(tuples)将在生成时传递给该对象,而不是累积在 SPI_tuptable 中。使用调用者提供的 DestReceiver 对象对于可能生成许多行的查询特别有用,因为数据可以即时处理,而不是累积在内存中。
const char * commandcommand string
const SPIExecuteOptions * options包含可选参数的结构体
调用者应始终将整个 options 结构体清零,然后填充他们想要设置的字段。这确保了代码的向前兼容性,因为在未来添加到该结构体中的任何字段都将被定义为如果它们为零时,则以向后兼容的方式运行。目前可用的 options 字段有:
ParamListInfo params包含查询参数类型和值的结构;如果没有则为 NULL
bool read_only只读执行时为 true
bool allow_nonatomictrue 允许 CALL 和 DO 语句的非原子执行(但此字段将被忽略,除非 SPI_OPT_NONATOMIC 标志已传递给 SPI_connect_ext)
bool must_return_tuples如果为 true,则在查询不是返回行的类型时引发错误(这并不禁止它碰巧返回零行的情形)
uint64 tcount要返回的最大行数,或 0 表示无限制
DestReceiver * destDestReceiver 对象,它将接收查询发出的任何行;如果为 NULL,则结果行会累积到 SPI_tuptable 结构中,与 SPI_execute 相同
ResourceOwner owner此字段是为了与 SPI_execute_plan_extended 保持一致性而存在的,但它被忽略了,因为 SPI_execute_extended 使用的计划永远不会被保存。
返回值与 SPI_execute 相同。
当 options->dest 为 NULL 时,SPI_processed 和 SPI_tuptable 的设置与 SPI_execute 相同。当 options->dest 不为 NULL 时,SPI_processed 被设置为零,SPI_tuptable 被设置为 NULL。如果需要行计数,调用者的 DestReceiver 对象必须计算它。