Chapter 17. 服务器编程接口

Table of Contents
17.1. 接口函数
SPI_connect — 把你的过程与 SPI 管理器连接起来.
SPI_finish — 把你的过程与 SPI 管理器断开.
SPI_exec — 创建一个执行规划 (分析器+规划器+优化器)并且执行一个查询.
SPI_prepare — 为一个查询准备规划,但还不执行它.
SPI_execp — 执行一个从 SPI_prepare 来的规划
SPI_cursor_open — 设置一个使用 SPI_prepare 创建的规划的游标
SPI_cursor_find — 通过名字查找一个现有游标(邮差)
SPI_cursor_fetch — 从游标中抓取一些行
SPI_cursor_move — 移动游标
SPI_cursor_close — 关闭一个游标
SPI_saveplan — 保存一个传入的规划
17.2. 接口支持函数
SPI_fnumber — 为指定属性名找出属性代码
SPI_fname — 找出指明字段编码的字段名
SPI_getvalue — 返回指明的字段的字符串值
SPI_getbinval — 返回指明字段的二进制数值
SPI_gettype — 返回指明字段的类型名
SPI_gettypeid — 返回指明字段的类型 OID
SPI_getrelname — 返回指明关系的名称
17.3. 存储器管理
SPI_copytuple — 在上层执行器环境制作元组的拷贝
SPI_copytupledesc — 在上层执行器环境中制作一份元组描述符拷贝
SPI_copytupleintoslot — 在上层执行器环境中制作元组及描述符的拷贝.
SPI_modifytuple — 通过替换一个给出元组的选定字段创建一个元组
SPI_palloc — 在上层执行器环境中分配存储器
SPI_repalloc — 重新在执行器上层环境中分配存储器
SPI_pfree — 在上层执行器环境中释放存储器
SPI_freetuple — 释放一个在上层执行器环境里分配的元组
SPI_freetuptable — 释放一个 SPI_exec 或类似的函数 创建的元组集
SPI_freeplan — 释放一个前面保存的规划
17.4. 数据改变的可视性
17.5. 例子

服务器编程接口SPI) 给我们在用户定义的C函数里面运行 SQL 查询的能力.

Note: 其他过程语言(PL)给我们一些实现这些功能的可选的手段.

实际上,SPI 只是一套用于访问分析器,规划器,优化器和执行器 的本机接口函数. SPI 同样做一些存储器管理工作.

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

使用 SPI 的过程都是由执行器 调用的. SPI 调用随后递归地调用执行器以运行查询. 当执行器被递归地调用的时候,它本身也可以调用那些做了 SPI 调用的过程.

注意,如果在你的过程里执行查询时,事务退出了,那么控制不会返回到你的过程中. 相反,所有工作都将回卷并且服务器将等待客户端的另一个命令. 这一点可能会在以后的版本中修正.

其他限制是不能执行 BEGIN,END 和 ABORT (交易控制语句). 这些同样在将来的版本中要被修改.

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

17.1. 接口函数

Table of Contents
SPI_connect — 把你的过程与 SPI 管理器连接起来.
SPI_finish — 把你的过程与 SPI 管理器断开.
SPI_exec — 创建一个执行规划 (分析器+规划器+优化器)并且执行一个查询.
SPI_prepare — 为一个查询准备规划,但还不执行它.
SPI_execp — 执行一个从 SPI_prepare 来的规划
SPI_cursor_open — 设置一个使用 SPI_prepare 创建的规划的游标
SPI_cursor_find — 通过名字查找一个现有游标(邮差)
SPI_cursor_fetch — 从游标中抓取一些行
SPI_cursor_move — 移动游标
SPI_cursor_close — 关闭一个游标
SPI_saveplan — 保存一个传入的规划