Chapter 40. 服务器编程接口

Table of Contents
40.1. 接口函数
SPI_connect — 把你一个过程与 SPI 管理器连接起来。
SPI_finish — 把一个过程与 SPI 管理器断开
SPI_push — 对 SPI 堆栈进行压栈操作以允许递规的 SPI 使用
SPI_pop — 弹出 SPI 堆栈以允许递规 SPI 使用
SPI_execute — 执行一条命令
SPI_exec — 执行一个读/写命令
SPI_prepare — 为一个命令准备一个规划,但还不执行它
SPI_getargcount — 返回一个 SPI_prepare 准备的已准备好规划需要的参数个数
SPI_getargtypeid — 返回 SPI_prepare 准备的已准备好规划的指定参数的 typeid
SPI_is_cursor_plan — 如果一个 SPI_prepare 准备的规划可以和 SPI_cursor_open 一起使用,则返回真
SPI_execute_plan — 执行一个 SPI_prepare 准备的查询规划
SPI_execp — 以读/写模式执行一个准备的查询规划
SPI_cursor_open — 用 SPI_prepare 创建的规划设置一个游标
SPI_cursor_find — 用名字寻找并执行一个现存的游标
SPI_cursor_fetch — 从一个游标里抓取一些行
SPI_cursor_move — 移动一个游标
SPI_cursor_close — 关闭一个游标
SPI_saveplan — 保存一个规划
40.2. 接口支持函数
SPI_fname — 从指定的字段编号判断字段名字
SPI_fnumber — 判断声明的字段名的字段编号
SPI_getvalue — 返回声明字段的字串值
SPI_getbinval — 返回声明字段的二进制值
SPI_gettype — 返回声明的字段的数据类型名
SPI_gettypeid — 返回声明的字段的数据类型 OID
SPI_getrelname — 返回声明关系的名字
SPI_getnspname — 返回声明关系的名字空间
40.3. 存储器管理
SPI_palloc — 在上层执行器环境里分配内存
SPI_repalloc — 在上层执行器环境里重新分配内存
SPI_pfree — 在上层执行器环境里释放内存
SPI_copytuple — 在上层执行者环境里制作一个行的拷贝
SPI_returntuple — 准备把一个元组当作 Datum 返回
SPI_modifytuple — 通过替换一个给出行的选定的字段创建一行
SPI_freetuple — 释放在上层执行者环境里分配的一行
SPI_freetuptable — 释放一个由 SPI_execute 或者类似的函数创建的行集
SPI_freeplan — 释放一个前面保存的规划
40.4. 数据改变的可视性
40.5. 例子

服务器编程接口SPI) 给我们在用户定义的C函数里面运行 SQL 查询的能力。 SPI 是一套接口函数,用于简化对分析器,规划器,优化器,和执行器的访问。 SPI 还进行一些内存管理的工作。

注意: 过程语言的存在也提供了其它的一些在过程里执行 SQL 命令的方法。 这些语言中的大部分本身就是基于 SPI的, 因此这份文档可能会对那些语言的用户同样有帮助。

为了避免混淆,我们将使用函数(function) 来代表SPI接口函数, 用过程(procedure) 代表用户用 SPI 定义的 C 函数。

注意,一条通过 SPI 调用的命令失败,那么控制不会返回到你的过程中。 取而代之的是,你的过程执行所在的事务或者子事务作都将回卷。 (这一点看起来可能很奇怪,因为大多数 SPI 函数的文档里都有错误返回习惯。 不过,那些习惯只适用于在 SPI 函数自己内部检测到的错误。) 我们可以通过在你自己的可能失败的 SPI 调用周围建立一个子事务的方法来在错误之后恢复。 目前我们还没有写这方面的文档,因为所需要的机制仍然在变化。

如果执行成功了,SPI 函数返回一个非负结果 (或者通过返回一个整数值或放在全局变量SPI_result里, 象下面描述的那样)。出错时,返回一个负数或 NULL 结果。

使用 SPI 的源代码文件必须包含头文件 executor/spi.h

40.1. 接口函数

Table of Contents
SPI_connect — 把你一个过程与 SPI 管理器连接起来。
SPI_finish — 把一个过程与 SPI 管理器断开
SPI_push — 对 SPI 堆栈进行压栈操作以允许递规的 SPI 使用
SPI_pop — 弹出 SPI 堆栈以允许递规 SPI 使用
SPI_execute — 执行一条命令
SPI_exec — 执行一个读/写命令
SPI_prepare — 为一个命令准备一个规划,但还不执行它
SPI_getargcount — 返回一个 SPI_prepare 准备的已准备好规划需要的参数个数
SPI_getargtypeid — 返回 SPI_prepare 准备的已准备好规划的指定参数的 typeid
SPI_is_cursor_plan — 如果一个 SPI_prepare 准备的规划可以和 SPI_cursor_open 一起使用,则返回真
SPI_execute_plan — 执行一个 SPI_prepare 准备的查询规划
SPI_execp — 以读/写模式执行一个准备的查询规划
SPI_cursor_open — 用 SPI_prepare 创建的规划设置一个游标
SPI_cursor_find — 用名字寻找并执行一个现存的游标
SPI_cursor_fetch — 从一个游标里抓取一些行
SPI_cursor_move — 移动一个游标
SPI_cursor_close — 关闭一个游标
SPI_saveplan — 保存一个规划