SPI_execute_plan_extended — 执行一个由SPI_prepare准备的语句
int SPI_execute_plan_extended(SPIPlanPtrplan, const SPIExecuteOptions *options)
SPI_execute_plan_extended 执行由 SPI_prepare 或其同类函数准备好的语句。该函数相当于 SPI_execute_plan,只是向查询传递参数值的方式不同, 同时还可以传入额外的执行控制选项。
查询参数值由 ParamListInfo 结构表示,这对于向下传递 已经以该格式存在的值非常方便。也可以借助 ParamListInfo 中指定的钩子函数使用动态参数集。
此外,结果元组不一定总是累积到 SPI_tuptable 结构中, 也可以在执行器生成元组时直接传给调用者提供的 DestReceiver 对象。对于可能生成大量元组的查询,这一点 尤其有用,因为数据可以边产生边处理,而不必全部堆积在内存中。
SPIPlanPtr plan预备语句(由SPI_prepare返回)
const SPIExecuteOptions * options包含可选参数的结构
调用者应始终先将整个 options 结构清零,然后再填 写想设置的字段。这样可以保证代码的前向兼容性,因为未来添加到该结构中的 任何字段,都会被定义为在取零值时保持向后兼容。当前可用的 options 字段如下:
ParamListInfo params包含查询参数类型和值的数据结构;没有参数时为 NULL
bool read_onlytrue 表示只读执行
bool allow_nonatomictrue 允许以非原子方式执行 CALL 与 DO 语句 (但除非向 SPI_connect_ext 传入了 SPI_OPT_NONATOMIC 标志,否则该字段会被忽略)
bool must_return_tuples如果为 true,当查询不属于返回元组的类型时就报错 (但这并不禁止其恰好返回零个元组)
uint64 tcount要返回的最大行数,或者用0表示没有限制
DestReceiver * dest用于接收查询发出的任意元组的 DestReceiver 对象; 如果为 NULL,则结果元组会像 SPI_execute_plan 一样 累积到 SPI_tuptable 结构中
ResourceOwner owner在执行期间为计划持有引用计数的资源所有者。如果为 NULL,则使用 CurrentResourceOwner。对于未保存的计划会忽略该字段,因为 SPI 不会为 这些计划获取引用计数。
返回值与 SPI_execute_plan 相同。
当 options->dest 为 NULL 时, SPI_processed 和 SPI_tuptable 的设置方式与 SPI_execute_plan 相同。当 options->dest 不为 NULL 时, SPI_processed 会被设为零,而 SPI_tuptable 会被设为 NULL。如果需要元组计数,则必 须由调用者提供的 DestReceiver 对象自行计算。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。